forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Проблемы с геометрией в PhysX (http://forum.boolean.name/showthread.php?t=18217)

DarkMedveD 27.05.2013 17:54

Проблемы с геометрией в PhysX
 


Вот такая беда. При попытке "приготовить" из модели TriangleMesh получается такая штука. Причем только с моими моделями. У меня есть моделька из какого-то примера, с ней все в порядке. Никаких косяков геометрии нет.

В чем проблема может быть? В структуре вертекса?
Экспортирую из Макса 2014, плагин - kwxport. Пробовал еще Axe Free, но он при создании TriangleMesh не выдает никакого результата.

Код приготовления модели:

Код:

//-----------------------------------------------------------------------------------------
// 1. Получить массив со всеми вершинами объекта
//----------------------------------------------------------------------------------------
        NxVec3 vPosition( x, y, z);


          vector<float> vertices;
       

    DWORD stride =  D3DXGetFVFVertexSize(Model->GetFVF());
    BYTE* vbptr = NULL;
    Model->LockVertexBuffer(0, (LPVOID*)&vbptr);
       
    int ii = -1;
    for(DWORD i = 0; i < Model->GetNumVertices(); i++)
    {
        ii++;
        D3DXVECTOR3* pos = (D3DXVECTOR3*)vbptr;
                D3DXVECTOR3 _tempPos=*pos;
                D3DXVec3TransformCoord(&_tempPos,&_tempPos,&scale);
        vertices.push_back(_tempPos.x);
        vertices.push_back(_tempPos.y);
        vertices.push_back(_tempPos.z);
               
               
        vbptr += stride;
    }
    Model->UnlockVertexBuffer();

//-----------------------------------------------------------------------------------------
// 2. Получить массив с индексами объекта
//---------------------------------------------------------------------------------------

          LPVOID * ppData;
    stride = sizeof(short);
    BYTE* ibptr = NULL;

    short* indices = new short[Model->GetNumFaces() * 3];

    vector<short> copy;

    Model->LockIndexBuffer(0, (LPVOID*)&indices);

    for(int i = 0; i < Model->GetNumFaces() * 3; i++)
    {
        copy.push_back(indices[i]);
    }

    Model->UnlockIndexBuffer();

//-----------------------------------------------------------------------------------------
// 3. Создать ограничивающие объемы
//---------------------------------------------------------------------------------------


        int NumVerticies = vertices.size() / 3;
    int NumTriangles = copy.size() / 3;
    //Create pointer for vertices
    NxVec3* verts = new NxVec3[NumVerticies];

        ii = -1;
    for(int i = 0; i < NumVerticies; i++)
    {
        ++ii;
        verts[i].x = vertices[ii];
        verts[i].y = vertices[++ii];
        verts[i].z = vertices[++ii];
    }
    //Create pointer for indices
    NxU16 *tris = new NxU16[copy.size()];
    for(int i = copy.size() - 1; i >= 0; i--)
        tris[i] = i;

    // Build physical model
    NxTriangleMeshDesc TriMeshDesc;
    TriMeshDesc.numVertices = NumVerticies;
    TriMeshDesc.numTriangles = NumTriangles;
    TriMeshDesc.pointStrideBytes = sizeof(NxVec3);
    TriMeshDesc.triangleStrideBytes = 3*sizeof(NxU16);
    TriMeshDesc.points = verts;
    TriMeshDesc.triangles = tris;
    TriMeshDesc.flags = NX_MF_16_BIT_INDICES ;//| NX_MF_FLIPNORMALS  ;
   
    NxTriangleMeshShapeDesc ShapeDesc;
    NxInitCooking();

    // Cooking from memory
    MemoryWriteBuffer buf;
    bool status = NxCookTriangleMesh(TriMeshDesc, buf);
    ShapeDesc.meshData = g_pPhysicsSDK->createTriangleMesh(MemoryReadBuffer(buf.data));

    NxActorDesc actorDesc;
    actorDesc.shapes.pushBack(&ShapeDesc);
    actorDesc.globalPose.t = vPosition;

    Actor = g_pScene->createActor(actorDesc);

    delete[] verts;
    delete[] tris;


4yBa4Ok 27.05.2013 18:49

Ответ: Проблемы с геометрией в PhysX
 
Не проще ли юзать 2 разных меша?

DarkMedveD 27.05.2013 18:51

Ответ: Проблемы с геометрией в PhysX
 
Проще. А как PhysX заставить использовать другой меш?
То есть я могу просто сделать упрощенную модель для столкновений, но это не изменит сути - готовить все придется. А он даже кубик умудряется вывернуть.

DarkMedveD 28.05.2013 12:44

Ответ: Проблемы с геометрией в PhysX
 
Ну хотя бы подскажите, чем вы экспортируете в .х из Макса...

4yBa4Ok 28.05.2013 18:34

Ответ: Проблемы с геометрией в PhysX
 
Я пользовался .obj . Импорт вытащил из какого-то тутора.

DarkMedveD 28.05.2013 19:03

Ответ: Проблемы с геометрией в PhysX
 
Можешь скинуть функцию загрузки модели из .obj?

4yBa4Ok 28.05.2013 19:44

Ответ: Проблемы с геометрией в PhysX
 
Я же говорю что пользовался) Посмотри в примерах) Я просто винду сносил, поставил Ultimate x64 вместо Home Premium x86

DarkMedveD 28.05.2013 20:49

Ответ: Проблемы с геометрией в PhysX
 
Я в тупике, мужики.
Какой день бьюсь - ничего не выходит. Что только не пробовал уже.


Часовой пояс GMT +4, время: 21:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot