我花了一些时间自己调查这个。
您可以通过访问其 getIndexedMeshArray[0] 来深度复制 btTriangleMesh
btTriangleMesh 不使用多个 btIndexedMesh。
使用 args (true, true) 构造所有 btTriangleMeshes,以强制索引和顶点数组分别为 Integer 和 btVector3 类型。
这是我编写的一些代码,用于从 btTriangleMesh 中提取三角形并将它们放入我自己的模型数据类 IndexedModel 中。
IndexedModel retrieveIndexedModelFromTriMesh(btTriangleMesh* trimesh){
IndexedModel retval;
//We will assume it was created using true, true
btIndexedMesh& mushy = trimesh->getIndexedMeshArray()[0]; //typedef btAlignedObjectArray< btIndexedMesh > IndexedMeshArray
size_t numVerts = mushy.m_numVertices;
size_t numTris = mushy.m_numTriangles;
size_t numIndices = numTris * 3;
PHY_ScalarType indexType = mushy.m_indexType;
PHY_ScalarType vertexType = mushy.m_vertexType;
if(indexType != PHY_INTEGER)
return getErrorShape("Error, tri mesh was apparently made using Short indices");
btVector3* vertArray = (btVector3*)mushy.m_vertexBase;
int* indArray = (int*)mushy.m_triangleIndexBase;
for(size_t i = 0; i < numIndices; i++){
retval.indices.push_back(retval.positions.size());
glm::vec3 pos = b2g_vec3(vertArray[indArray[i]]);
retval.positions.push_back(pos);
}
retval.validate(); //fills in texcoords and normals for exporting to OBJ
return retval;
//Vertex Stride is sizeof(btVector3)
//Index stride is sizeof(int) * 3 (per triangle, of course)
}
我不得不在 Bullet 的源代码中四处挖掘以弄清楚如何做到这一点。
我是这样做的: 1) 查看 btTriangleMesh 的 cpp 文件并注意到它只使用了 m_IndexedMeshArray[0] 为了方便起见,这里是指向 pybullet 上的 CPP 文件参考的链接
https://pybullet.org/Bullet/BulletFull/btTriangleMesh_8cpp_source。 html
2)查找IndexedMeshArray typedef
https://pybullet.org/Bullet/BulletFull/btTriangleIndexVertexArray_8h.html#ad682f0bb6b27957cb135e379beb73b54
3)我去了btIndexedMesh页面
https://pybullet.org/Bullet/BulletFull/structbtIndexedMesh.html
4)我查看了类型
5)我回到btTriangleMesh的cpp文件并逆向工程类。
子弹物理学的复杂程度严重不足。每个高级功能似乎都需要一个小时左右的挖掘才能弄清楚。
除了回答您的问题之外,希望这能让您了解如何继续使用项目符号。