如何处理用于物理模拟的VBO和obj文件?

时间:2019-03-29 21:49:27

标签: c++ vbo opengl-3 particles wavefront

我很难处理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_verticesout_indices设置要渲染的VAO,VBO和EBO。这里的问题是在VBO中,有多个具有相同position值的VERTEX对象。

但是,为了进行物理模拟,我需要一个particle类,用于计算每个布料粒子的每个环的力,速度和位置。

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

如果我只是将VERTEX对象的位置值复制到particle对象,那么将有多个particle对象具有相同的位置值。但这似乎不对,因为每个唯一位置都应该只有一个particle对象。

因此,目前我的解决方案是,首先制作每个具有唯一位置值的particle对象。然后,在每个物理循环计算出粒子的速度,力,位置之后,我更新所有VERTEX对象,这些对象的位置值对于相应的“位置”对象已更改。最后,我更新了VBO。

这是正确的方法吗?恐怕线性搜索与粒子对象具有相同position值的多个VERTEX对象将花费大量时间。任何帮助,将不胜感激。预先感谢!


简而言之,我想寻求建议的是如何有效地分离和处理渲染数据和物理模拟数据。

0 个答案:

没有答案