如何在Bullet Physics中深度复制一个btTriangleMesh?

问题描述 投票:1回答:1

我使用Bullet Physics,我需要复制一个btTriangleMesh的实例。btTriangleMesh 型。

// the variable is a class member
btTriangleMesh triangles;

我的目的是将一个体的碰撞形状改为一个新的三角形网格形状。这个形状应该包含当前存储在 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
// ...

我想在堆上实例化一个新的变量。new btTriangleMesh(triangles) 会深度复制对象。但正如你在下面的图片中所看到的,第一个物体的碰撞形状会受到下一个物体的影响。

在图片中,白色的线条代表了碰撞的形状,而你可以看到下面渲染的实际需要的形状。这是第一个主体的样子,一切正常。

a single chunk with correct collision shape

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

inserting a second chunk unwantedly changes the shape of the first one

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

顺便说一下,我使用同一个变量作为所有三角形形状的源,原因是这个变量是由另一个线程异步填充的,我使用Bullet Physics,我需要复制一个btTriangleMesh类型的实例。

c++ pointers heap copy-constructor bulletphysics
1个回答
0
投票

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

你可以通过访问它的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.orgBulletBulletFullbtTriangleMesh_8cpp_source.html。

2)查找IndexedMeshArray typedef https:/pybullet.orgBulletBulletFullbtTriangleIndexVertexArray_8h.html#ad682f0bb6b27957cb135e379beb73b54。

3) 我进入了btIndexedMesh页面https:/pybullet.orgBulletBulletFullstructbtIndexedMesh.html。

4)我看了一下类型

5) 我回到btTriangleMesh的cpp文件,对这个类进行了逆向工程。

子弹物理学是灾难性的文档不足,因为它是多么复杂。每一个高级功能似乎都需要花上一个小时左右的时间才能弄明白。

希望这除了回答你的问题外,还能让你知道如何继续使用子弹。

© www.soinside.com 2019 - 2024. All rights reserved.