我很难处理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中,有多个具有相同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对象将花费大量时间。任何帮助,将不胜感激。预先感谢!
简而言之,我想寻求建议的是如何有效地分离和处理渲染数据和物理模拟数据。