Использование Bullet Physics для загрузки модели OBJ в btGImpactMeshShape, но результат неверен

Я использую Bullet Physics Engine для загрузки модели OBJ в мир с помощью btGImpactMeshShape. Я новичок в использовании этого движка.

Вот мой код

//---------------------------------------//

//            load from obj              //

//---------------------------------------//

ConvexDecomposition::WavefrontObj wobj;
printf("load first try"); fflush( stdout );
std::string filename("bunny.obj");
int result = wobj.loadObj( "bunny.obj" );
if(!result)
{
printf("first try fail\n"); fflush( stdout );
printf("load second try");  fflush( stdout );
result = wobj.loadObj("../bunny.obj");
}

printf("--load status %d\n", result );
printf("--triangle: %d\n", wobj.mTriCount);
printf("--vertex: %d\n", wobj.mVertexCount);


btTriangleIndexVertexArray* colonVertexArrays = new btTriangleIndexVertexArray(
wobj.mTriCount,
wobj.mIndices,
                3*sizeof(int),
                wobj.mVertexCount,
                wobj.mVertices,
                3*sizeof(float)
                );

btGImpactMeshShape* bunnymesh = new btGImpactMeshShape(colonVertexArrays);
bunnymesh ->setLocalScaling( btVector3(0.5f, 0.5f, 0.5f) );
bunnymesh ->updateBound();
startTransform.setOrigin( btVector3(0.0, 0.0, 0.0) );
startTransform.getBasis().setEulerZYX( 0, 0, 0 );
localCreateRigidBody( bunnymesh , startTransform, 0.0 );
printf("Load done...\n");

Вот в той модели которую я загрузил.............этот зайчик просматривался с помощью MeshLab на MAC

исходная модель кролика, просмотренная Meshlab

Я пытался изменить различные параметры шага, однако это результат моей программы.

использование маркера для просмотра БанниКонсольный вывод

У вас есть предложения, что не так с кодом?


person MooMoo    schedule 16.06.2014    source источник


Ответы (2)


Разве wobj.mVertices не является указателем на двойной массив? btTriangleIndexVertexArray ожидает, что указатель будет плавающим, поэтому вам придется создать новый массив с плавающей запятой, скопировать и преобразовать в него вершины.

person Patrick Simpson    schedule 15.10.2014
comment
Спасибо за ваше предложение. Однако как я могу установить указатель на плавающий. Проблема связана с моей моделью? или мне нужно изменить какие-либо части моего кода. - person MooMoo; 15.10.2014

Блендер называет свои индексы, начинающиеся с 1, в то время как Bullet Physics начинает с 0. В качестве иллюстрации, здесь ниже кубическая сетка, экспортированная из Блендера, затем визуализированная как btGImpactMeshShape, и 3 куба, визуализированные как btBoxShape. Также ниже показано, как должны выглядеть вершины и индексы для btTriangleIndexVertexArray, чтобы сетка куба правильно отображалась в Bullet Physics как btGImpactMeshShape. Для получения дополнительной информации щелкните ссылку, чтобы увидеть аналогичную тему на Форум Bullet Physics.

Чтобы узнать больше о btTriangleIndexVertexArray и btGImpactMeshShape, см. также в SDK Bullet Physics демо-версию GimpactTestDemo, которая демонстрирует тор и... кролика Стэндфорда.

const int NUMBER_VERTICES = 8;
const int NUMBER_TRIANGLES = 12;

static float cubeVertices[NUMBER_VERTICES * 3] = {
    1.000000, -1.000000, -1.000000,
    1.000000, -1.000000, 1.000000,
   -1.000000, -1.000000, 1.000000,
   -1.000000, -1.000000, -1.000000,
    1.000000, 1.000000, -0.999999,
    0.999999, 1.000000, 1.000001,
   -1.000000, 1.000000, 1.000000,
   -1.000000, 1.000000, -1.000000
};

static int cubeIndices[NUMBER_TRIANGLES][3] = {
   { 1, 3, 0 },
   { 7, 5, 4 },
   { 4, 1, 0 },
   { 5, 2, 1 },
   { 2, 7, 3 },
   { 0, 7, 4 },
   { 1, 2, 3 },
   { 7, 6, 5 },
   { 4, 5, 1 },
   { 5, 6, 2 },
   { 2, 6, 7 },
   { 0, 3, 7 }
};

введите здесь описание изображения

person LastBlow    schedule 11.11.2017