【问题标题】:Bullet Physics - Creating ShapeHull from MeshBullet Physics - 从网格创建 ShapeHull
【发布时间】:2014-06-04 12:53:12
【问题描述】:

我正在尝试将用于通过 OpenGL 绘制的网格数据加载到子弹引擎中。

问题是我不相信网格数据实际上是从指针中读取的。因此物理世界不匹配,“角色控制器”从地板上掉下来。

渲染的世界很好,所以我知道 OpenGL 数据很好。

这是我用来将数据传输到 OpenGL 的控制器类的函数。

这里有什么我遗漏的吗?

谢谢 - 这是我正在使用的代码:

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]);
   }
}

【问题讨论】:

    标签: c++ opengl game-physics physics-engine bulletphysics


    【解决方案1】:

    也许,这不是您正在寻找的答案,但也许您可以使用 btConvexHullShape,正如 Bullet 文档中所建议的那样?

    http://bulletphysics.org/Bullet/BulletFull/classbtConvexTriangleMeshShape.html

    尽管如此,大多数用户应该使用性能更好的 btConvexHullShape 代替。

    并使用addPoint逐一添加顶点,文档中也提到:

    http://bulletphysics.org/Bullet/BulletFull/classbtConvexHullShape.html

    在构造函数中不传递任何点更容易,只需添加 一次一点,使用 addPoint

    我知道回答 “只使用其他东西”而不是回答原始问题是不好的。

    同样,您将复制您的顶点。

    但是,如果您才刚刚开始学习一些新技术,您可能希望先让一切正常工作,然后逐步恢复到您的原始设计可能会更容易。

    另一个好主意是使用 调试抽屉 并实际查看网格的外观。

    前段时间,我为 OpenGL ES 2.0 创建了一个,也许它会有所帮助: https://github.com/kmuzykov/custom-opengl-es-game-engine/blob/master/Engine/Physics/KMPhysicsDebugDrawer.cpp

    【讨论】:

    • 谢谢,值得一试,我试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多