Bullet Physics — Создание ShapeHull из сетки

Я пытаюсь загрузить данные меша, которые я использую для рисования с OpenGL, в Bullet Engine.

Проблема в том, что я не верю, что данные меша действительно читаются из указателей. Таким образом, физический мир не совпадает, и «Контроллер персонажа» падает через пол.

Мир визуализации в порядке, поэтому я знаю, что данные 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]);
}
}

1

Решение

Возможно, не тот ответ, который вы ищете, но, вероятно, вы могли бы использовать btConvexHullShape, как посоветовали в пулевой документации?

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

4

Другие решения


По вопросам рекламы [email protected]