Проблемы, превращающие загруженные сетки в моделирование ткани

У меня возникла небольшая проблема с попыткой получить сетки, которые я импортирую в свою программу, чтобы иметь физику моделирования ткани с использованием системы частиц / пружин. Я как новичок в графическом программировании, так что извините, если это супер очевидно, и я просто что-то упустил. Я использую 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));
    }
}

0 ответов

Другие вопросы по тегам