Using btIndexedMesh with btTriangleIndexVertexArray+btBvhTriangleMeshShape
Posted: Sun Oct 29, 2023 5:19 pm
I am trying to create static physics bodies using btBvhTriangleMeshShape.
This works fine if I copy vertex data into btTriangleMesh, and use that to create a btBvhTriangleMeshShape. However, copying is obviously not desirable.
The approach I am currently trying is:
In my mesh class ("GeometryElement"):
Code for creating the btIndexedMesh + btTriangleIndexVertexArray + btBvhTriangleMeshShape:
I am getting a segfault in btStridingMeshInterface::InternalProcessAllTriangles() when initializing the btBvhTriangleMeshShape. From the debugger gfxindextype is PHY_INTEGER, which leads me to believe it's getting hung up processing the vertex faces array.
Can anybody shed some light on this? Am I using btIndexedMesh incorrectly? Much thanks.
This works fine if I copy vertex data into btTriangleMesh, and use that to create a btBvhTriangleMeshShape. However, copying is obviously not desirable.
The approach I am currently trying is:
- Describe vertex layout using btIndexedMesh referencing existing visual data
- Create btTriangleIndexVertexArray using btIndexedMesh
- Create btBvhTriangleMeshShape using btTriangleIndexVertexArray
Code: Select all
typedef struct {
int a;
int b;
int c;
} Face;
typedef struct {
glm::vec3 position;
glm::vec3 normal;
glm::vec2 textureCoordinate;
} Vertex;
Code: Select all
const std::vector<Vertex>& vertices() const;
const std::vector<Face>& faces() const;
Code: Select all
auto triangleIndexVertexArray = btTriangleIndexVertexArray();
for (auto& element : geometry->elements()) {
auto verts = element->vertices();
auto faces = element->faces();
auto indexedMesh = btIndexedMesh();
indexedMesh.m_numTriangles = (int)faces.size();
indexedMesh.m_triangleIndexBase = (const unsigned char *)&faces[0];
indexedMesh.m_triangleIndexStride = sizeof(Face); // sizeof(Face), sizeof(int)?
indexedMesh.m_indexType = PHY_INTEGER;
indexedMesh.m_numVertices = (int)verts.size();
indexedMesh.m_vertexBase = (const unsigned char *)&verts[0];
indexedMesh.m_vertexStride = sizeof(Vertex); // sizeof(Vertex), sizeof(glm::vec3)?
indexedMesh.m_vertexType = PHY_FLOAT;
triangleIndexVertexArray.addIndexedMesh(indexedMesh);
}
auto shape = btBvhTriangleMeshShape(&triangleIndexVertexArray, true);
Can anybody shed some light on this? Am I using btIndexedMesh incorrectly? Much thanks.