我正在尝试将我用于使用 OpenGL 绘制的网格数据加载到 Bullet 引擎中。
问题是我不相信网格数据实际上是从指针中读取的。因此物理世界不匹配,“角色 Controller ”从地板上掉下来。
渲染的世界很好,所以我知道 OpenGL 数据很好。
这是我用来将数据传输到 OpenGL 的 Controller 类的函数。
我在这里遗漏了什么吗?
谢谢 - 这是我正在使用的代码:
void PhysicsController::AddStaticBasicMesh(PhysicsObject* NewObject, bool ReducePolygonCount = true)
{
btTriangleMesh* OriginalTriangleMesh = new btTriangleMesh();
btIndexedMesh* NewMesh = new btIndexedMesh();
NewMesh->m_triangleIndexBase = (unsigned char *)NewObject->Indices;
NewMesh->m_triangleIndexStride = 3 * sizeof(unsigned int);
NewMesh->m_vertexBase = (unsigned char *)NewObject->Vertices;
NewMesh->m_vertexStride = 3 * sizeof(float);
NewMesh->m_numVertices = NewObject->NumberOfVertices;
NewMesh->m_numTriangles = NewObject->NumberOfTriangles;
OriginalTriangleMesh->addIndexedMesh((*NewMesh));
btConvexShape* NewStaticMesh = new btConvexTriangleMeshShape(OriginalTriangleMesh);
btConvexHullShape* ReducedPolygonStaticMesh;
if (ReducePolygonCount == true) {
btShapeHull* HullOfOriginalShape = new btShapeHull(NewStaticMesh);
btScalar CurrentMargin = NewStaticMesh->getMargin();
HullOfOriginalShape->buildHull(CurrentMargin);
ReducedPolygonStaticMesh = new btConvexHullShape();
for (int i = 0; i < HullOfOriginalShape->numVertices(); i++) {
ReducedPolygonStaticMesh->addPoint(HullOfOriginalShape->getVertexPointer()[i], false);
}
ReducedPolygonStaticMesh->recalcLocalAabb();
/*
Find out what this line does.
ReducedPolygonStaticMesh->initializePolyhedralFeatures();
*/
StaticShapes.push_back(ReducedPolygonStaticMesh);
btDefaultMotionState* StaticMotionState = new btDefaultMotionState((*NewObject->PositionAndOrientation));
btRigidBody::btRigidBodyConstructionInfo StaticMeshRigidBodyInfo(0, StaticMotionState, ReducedPolygonStaticMesh, btVector3(0.0f, 0.0f, 0.0f));
btRigidBody* StaticRigidMesh = new btRigidBody(StaticMeshRigidBodyInfo);
NewObject->Body = StaticRigidMesh;
StaticRigidMesh->setCollisionFlags(StaticRigidMesh->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT);
MainPhysicsWorld->addRigidBody(StaticRigidMesh, btBroadphaseProxy::StaticFilter, btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::DefaultFilter);
AllRigidBodies.push_back(NewObject);
StaticRigidMesh->setUserPointer(AllRigidBodies[AllRigidBodies.size() - 1]);
delete HullOfOriginalShape;
delete NewStaticMesh;
} else {
StaticShapes.push_back(NewStaticMesh);;
btDefaultMotionState* StaticMotionState = new btDefaultMotionState((*NewObject->PositionAndOrientation));
btRigidBody::btRigidBodyConstructionInfo StaticMeshRigidBodyInfo(0, StaticMotionState, NewStaticMesh, btVector3(0.0f, 0.0f, 0.0f));
btRigidBody* StaticRigidMesh = new btRigidBody(StaticMeshRigidBodyInfo);
NewObject->Body = StaticRigidMesh;
StaticRigidMesh->setCollisionFlags(StaticRigidMesh->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT);
MainPhysicsWorld->addRigidBody(StaticRigidMesh, btBroadphaseProxy::StaticFilter, btBroadphaseProxy::CharacterFilter | btBroadphaseProxy::DefaultFilter);
AllRigidBodies.push_back(NewObject);
StaticRigidMesh->setUserPointer(AllRigidBodies[AllRigidBodies.size() - 1]);
}
}
最佳答案
也许,这不是您正在寻找的答案,但您可能可以使用 btConvexHullShape
,如 Bullet 文档中所建议的那样?
http://bulletphysics.org/Bullet/BulletFull/classbtConvexTriangleMeshShape.html
Nevertheless, most users should use the much better performing btConvexHullShape instead.
并使用addPoint
逐一添加顶点,文档中也有提到:
http://bulletphysics.org/Bullet/BulletFull/classbtConvexHullShape.html
It is easier to not pass any points in the constructor, and just add one point at a time, using addPoint
我知道回答“只是使用其他东西”而不是回答原始问题是不好的。
同样,您将通过这种方式复制顶点。
但是,如果您才刚刚开始学习一些新技术,您可能希望先让一切正常运行,然后再逐步返回到您的原始设计可能会更容易。
另一个好主意是使用调试抽屉 并实际查看您的网格的外观。
前段时间我为 OpenGL ES 2.0 创建了一个,也许它会有所帮助: https://github.com/kmuzykov/custom-opengl-es-game-engine/blob/master/Engine/Physics/KMPhysicsDebugDrawer.cpp
关于c++ - Bullet Physics - 从网格创建 ShapeHull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24038024/