C++ 如何深度复制子弹物理中的btTriangleMesh?

C++ 如何深度复制子弹物理中的btTriangleMesh?,c++,pointers,heap,copy-constructor,bulletphysics,C++,Pointers,Heap,Copy Constructor,Bulletphysics,我使用子弹物理,需要复制btTriangleMesh类型的实例 // the variable is a class member btTriangleMesh triangles; 我的目标是将实体的碰撞形状更改为新的三角形网格形状。此形状应保存当前存储在三角形变量中的数据,即使该变量将来会更改。因此,我需要一份深度副本 // in a method change collision shape btTriangleMesh *copy = new btTriangleMesh(triang

我使用子弹物理,需要复制
btTriangleMesh
类型的实例

// the variable is a class member
btTriangleMesh triangles;
我的目标是将实体的碰撞形状更改为新的三角形网格形状。此形状应保存当前存储在
三角形
变量中的数据,即使该变量将来会更改。因此,我需要一份深度副本

// in a method change collision shape
btTriangleMesh *copy = new btTriangleMesh(triangles);
btBvhTriangleMeshShape *shape = new btBvhTriangleMeshShape(copy), true, true);
body->setCollisionShape(shape);

// after that, reset variable
triangles = btTriangleMesh();

// change content of variable for next body
// ...
我认为在堆
newbttrianglemesh(triangles)
上实例化一个新变量会深度复制对象。但正如您在下图中所看到的,第一个实体的碰撞形状受下一个实体的影响

在图像中,白线表示碰撞形状,而您可以看到下面渲染的实际所需形状。这就是第一个身体的样子,这里一切都很好

这就是在右侧插入另一个物体后的样子。第一个物体的形状变为与第二个物体的形状相等。这不应该发生。图像上可能不清楚,但在3D中,您肯定会看到第一个物体的形状发生了变化,与第二个物体的形状完全匹配

如何深度复制
btTriangleMesh
?还是我做错了什么


顺便说一句,我使用相同的变量作为所有三角形形状的源的原因是这个变量由另一个线程异步填充。

我自己花了一些时间研究这个问题

您可以通过访问btTriangleMesh的getIndexedMeshArray[0]来深度复制btTriangleMesh

btTriangleMesh不使用多个btIndexedMesh

使用args(true,true)构造所有BTTriangleMesh,以强制索引和顶点数组分别为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)
}
IndexedModelRetrieveIndexedModelFromTrimesh(btTriangleMesh*trimesh){
IndexedModel retval;
//我们假设它是用true,true创建的
btIndexedMesh&mushy=trimesh->getIndexedMeshArray()[0];//typedef btAlignedObjectArrayIndexedMeshArray
尺寸=糊状物的重量;
粒径=糊状的纳米三角形;
尺寸=numTris*3;
PHY_ScalarType indexType=mushy.m_indexType;
PHY_ScalarType vertexType=mushy.m_vertexType;
if(indexType!=PHY\u整数)
return getErrorShape(“错误,三重网格显然是使用短索引制作的”);
btVector3*vertArray=(btVector3*)mushy.m_vertexBase;
int*indArray=(int*)mushy.m_triangleIndexBase;
对于(大小i=0;i
我必须仔细研究Bullet的源代码,找出如何做到这一点

我是这样做的: 1) 查看了btTriangleMesh的cpp文件,发现它只使用了m_IndexedMeshArray[0] 为了方便起见,这里有一个指向pybullet上CPP文件参考的链接

2) 查找IndexedMeshArray typedef

3) 我去了btIndexedMesh页面

4) 我看了一下类型

5) 我回到btTriangleMesh的cpp文件,对类进行了反向工程

子弹物理学是多么的复杂,但它的记录却少得可怜。每一项高级功能似乎都需要一个小时左右的挖掘才能找到答案

希望这能给你一个想法,除了回答你的问题外,如何继续使用bullet