У меня возникла небольшая проблема с попыткой получить сетки, которые я импортирую в свою программу, чтобы иметь физику моделирования ткани с использованием системы частиц / пружин. Я как новичок в графическом программировании, так что извините, если это супер очевидно, и я просто что-то упустил. Я использую C ++ с OpenGL, а также Assimp для импорта моделей. Я вполне уверен, что мой код для вычисления ограничений / пружин и шага каждой частицы правильный, так как я проверил его с помощью сгенерированных сеток (с квадратами вместо треугольников), и это выглядело нормально, но idk.
Я использовал эту ссылку, чтобы узнать, как на самом деле сделать это: https://nccastaff.bournemouth.ac.uk/jmacey/MastersProjects/MSc2010/07LuisPereira/Thesis/LuisPereira_Thesis.pdf
Как это выглядит в двигателе: https://www.youtube.com/watch?v=RyAan27wryU
Я почти уверен, что это проблема с соединениями / пружинами, поскольку импортированная модель, которая представляет собой плоскую плоскость, по большей части работает нормально. Другая модель, хотя .. кажется, просто разваливается. Я продолжаю смотреть на бумаги по этому вопросу, и из того, что я понимаю, все должно работать правильно, так как я соединяю пружины ребра / изгиба, казалось бы, правильно, и физическая сторона, кажется, работает с плоских плоскостей. Я действительно не могу понять это для моей жизни! Любые советы / помощь будут с благодарностью! 🙂
Код для обработки сетки в ткань:
// Container to temporarily hold faces while we process springs
std::vector<Face> faces;
// Go through indices and take the ones making a triangle.
// Indices come from assimp, so i think this is the right thing to do to get each face?
for (int i = 0; i < this->indices.size(); i+=3)
{
std::vector<unsigned int> faceIds = { this->indices.at(i), this->indices.at(i + 1), this->indices.at(i + 2) };
Face face;
face.vertexIDs = faceIds;
faces.push_back(face);
}
// Iterate through faces and add constraints when needed.
for (int l = 0; l < faces.size(); l++)
{
// Adding edge springs.
Face temp = faces[l];
makeConstraint(particles.at(temp.vertexIDs[0]), particles.at(temp.vertexIDs[1]));
makeConstraint(particles.at(temp.vertexIDs[0]), particles.at(temp.vertexIDs[2]));
makeConstraint(particles.at(temp.vertexIDs[1]), particles.at(temp.vertexIDs[2]));// We need to get the bending springs as well, and i've just written a function to do that.
for (int x = 0; x < faces.size(); x++)
{
Face temp2 = faces[x];
if (l != x)
{
verticesShared(temp, temp2);
}
}
}
И вот код, где я обрабатываю изгибающие пружины:
// Container for any indices the two faces have in common.
std::vector<glm::vec2> traversed;
// Loop through both face's indices, to see if they match eachother.
for (int i = 0; i < a.vertexIDs.size(); i++)
{
for (int k = 0; k < b.vertexIDs.size(); k++)
{
// If we do get a match, we push a vector into the container containing the two indices of the faces so we know which ones are equal.
if (a.vertexIDs.at(i) == b.vertexIDs.at(k))
{
traversed.push_back(glm::vec2(i, k));
}
}
// If we're here, if means we have an edge in common, aka that we have two vertices shared between the two faces.
if (traversed.size() == 2)
{
// Get the adjacent vertices.
int face_a_adj_ind = 3 - ((traversed[0].x) + (traversed[1].x));
int face_b_adj_ind = 3 - ((traversed[0].y) + (traversed[1].y));
// Turn the stored ones from earlier and just get the ACTUAL indices from the face. Indices of indices, eh.
unsigned int adj_1 = a.vertexIDs[face_a_adj_ind];
unsigned int adj_2 = b.vertexIDs[face_b_adj_ind];
// And finally, make a bending spring between the two adjacent particles.
makeConstraint(particles.at(adj_1), particles.at(adj_2));
}
}
Задача ещё не решена.
Других решений пока нет …