Вот такая беда. При попытке "приготовить" из модели 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;