Как работать с VBO и obj файлами для симуляции физики? - PullRequest
0 голосов
/ 30 марта 2019

Мне тяжело бороться с файлами obj и симуляциями одежды.Сначала я создал класс обработчика файла obj, который решает типичную проблему файла obj: наличие нескольких индексов для позиции вершины, координат текстуры вершины и нормалей вершины, подобных этой f 52/49/224 57/54/224 279/270/224.Я сделал функцию, которая сокращает несколько индексных массивов до одного индексного массива.

class VERTEX{
public:
    glm::vec3 position;
    glm::vec2 uv_coord;
    glm::vec3 normal;
};

std::vector<VERTEX> out_vertices;
std::vector<unsigned int> out_indices;

void reorderData(){
        for(int i=0;i<vertexIndices.size();i++){
            VERTEX vertex;
            // add -1 to each index as indices for obj files start from 1, not 0.
            int vi = vertexIndices[i]-1;
            int uvi = uvIndices[i]-1;
            int ni = normalIndices[i]-1;
            vertex.position = temp_vertices[vi];
            vertex.uv_coord = temp_uvs[uvi];
            vertex.normal = temp_normals[ni];
            //assign new index here for the VERTEX object
            int index = getVertexIndex(vertex);
            //If it's a new index, it means it's a new VERTEX. Store it in out_vertices.
            if(index==out_vertices.size()){
                out_vertices.push_back(vertex);
            }
            out_indices.push_back(index);
        }
    }

Затем я использую out_vertices и out_indices, чтобы настроить VAO, VBO и EBO для рендеринга.Проблема здесь заключается в том, что в VBO есть несколько объектов VERTEX, которые имеют одинаковое значение position.

Однако, чтобы выполнить физическое моделирование, мне нужен класс particle, который занимается вычислениемсила, скорость, позиция для каждой петли каждой частицы ткани.

class particle{
public:
    glm::vec3 position;
    glm::vec3 force;
    glm::vec3 speed;
    float mass;
}

И если я просто скопирую значения положения VERTEX объектов в объекты particle, тогда будет несколько particle объекты с одинаковым значением позиции.Но это не кажется правильным, так как для каждой уникальной позиции должен быть только один particle объект.

Поэтому на данный момент мое решение состоит в том, чтобы сначала создать particle объектов, каждый из которых имеет уникальные значения положения.Затем, после каждого физического цикла, вычисляющего скорость, силу, положение частицы, я обновляю все объекты VERTEX, значение позиции которых изменилось для соответствующего объекта 'позиция'.Наконец, я обновляю VBO.

Это был бы правильный подход?Я боюсь, что линейный поиск нескольких объектов VERTEX, которые имеют то же значение position, что и объект частицы, займет много времени.Любая помощь будет оценена.Заранее спасибо!


Короче говоря, я хочу получить совет о том, как эффективно разделять и обрабатывать данные рендеринга и данные физического моделирования.

...