Пуля btBvhTriangleMeshShape не сталкивается

Я пытаюсь создать btBvhTriangleMeshShape из большой сетки в своем приложении и использовать ее как жесткое тело. Это твердое тело будет составлять «плоскость земли», которая статична и никогда не движется. Проблема в том, что все падает насквозь, как будто его и нет. Вот текущий источник:

btTriangleMesh* tMesh = new btTriangleMesh();
irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(1);

irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices();
irr::u16* Indices = MB->getIndices();

for (irr::u32 i = 0; i < MB->getIndexCount(); i+=3)
{
    irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos;
    irr::core::vector3df Tri2Pos = Vertices[Indices[i+1]].Pos;
    irr::core::vector3df Tri3Pos = Vertices[Indices[i+2]].Pos;

    tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z));
}

btCollisionShape* groundShape = new btBvhTriangleMeshShape(tMesh, false);
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0)));
PH->CreateRigidBody(0, groundMotionState, groundShape);

PH->CreateRigidBody() — это просто вспомогательная функция для быстрого создания твердых тел, я знаю, что эта функция работает правильно, поскольку другие объекты используют ее и прекрасно сталкиваются.

Любое понимание проблемы здесь будет с благодарностью. Всем большое спасибо за уделенное время.

РЕДАКТИРОВАТЬ: после подключения ящика отладки вот что он отображает (это снимок из-под сетки): enter image  описание здесь И для пояснения вот снимок выше: введите описание изображения здесь

Я не знаю, проблема в самой сетке или в коде, который перебирает вершины для создания физической сетки.


person KKlouzal    schedule 16.06.2014    source источник
comment
Что мешает падению пола? Вы включили режим отладки, чтобы убедиться, что этого не происходит?   -  person weston    schedule 17.06.2014
comment
Да, я пошел дальше и подключил представление отладки, и пол там, где он должен быть.   -  person KKlouzal    schedule 18.06.2014
comment
Я предполагаю, что зеленый цвет — это треугольники, а красный — объем переплета. Можете ли вы объяснить, как должен выглядеть пол, потому что он выглядит так, как будто в нем много щелей, на самом деле в основном это щели. Так что не удивлюсь, что многое проваливается.   -  person weston    schedule 18.06.2014


Ответы (1)


При повторении треугольников, предоставленных с помощью буфера сетки Irrlicht, мне нужно было пройти через ВСЕ буферы сетки, присутствующие в модели, следующим образом:

btTriangleMesh* tMesh = new btTriangleMesh();

irr::u32 MBCount = WorldMesh1->getMeshBufferCount();

for (irr::u32 m = 0; m < MBCount; m++)
{
    irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(m);

    irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices();
    irr::u16* Indices = MB->getIndices();

    for (irr::u32 i = 0; i < MB->getIndexCount(); i += 3)
    {
        irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos;
        irr::core::vector3df Tri2Pos = Vertices[Indices[i + 1]].Pos;
        irr::core::vector3df Tri3Pos = Vertices[Indices[i + 2]].Pos;

        tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z));
    }
}
person KKlouzal    schedule 18.06.2014