Держите:
Model - Сетка
Actor - физический объект
void Mesh::GenerateTriangleMeshFromDXMesh()
{
typedef struct {
D3DXVECTOR3 VertexPos;
D3DXVECTOR3 Normal;
D3DXVECTOR2 TexCoord;
} Mesh_FVF;
//Used to copy indices
typedef struct {
short IBNumber[3];
} IndexBufferStruct;
int NumVerticies = Model->GetNumVertices();
int NumTriangles = Model->GetNumFaces();
DWORD FVFSize = D3DXGetFVFVertexSize(Model->GetFVF());
//Create pointer for vertices
NxVec3* verts = new NxVec3[NumVerticies];
char *DXMeshPtr;
Model->LockVertexBuffer(D3DLOCK_READONLY, (void**)&DXMeshPtr);
for(int i = 0; i < NumVerticies; i++)
{
Mesh_FVF *DXMeshFVF = (Mesh_FVF*)DXMeshPtr;
verts[i] = NxVec3(DXMeshFVF->VertexPos.x, DXMeshFVF->VertexPos.y, DXMeshFVF->VertexPos.z);
DXMeshPtr += FVFSize;
}
Model->UnlockVertexBuffer();
//Create pointer for indices
IndexBufferStruct *tris = new IndexBufferStruct[NumTriangles];
IndexBufferStruct *DXMeshIBPtr;
Model->LockIndexBuffer(D3DLOCK_READONLY, (void**)&DXMeshIBPtr);
for(int NumInd = 0; NumInd < NumTriangles; NumInd++)
{
tris[NumInd].IBNumber[0] = DXMeshIBPtr[NumInd].IBNumber[0];
tris[NumInd].IBNumber[1] = DXMeshIBPtr[NumInd].IBNumber[1];
tris[NumInd].IBNumber[2] = DXMeshIBPtr[NumInd].IBNumber[2];
}
Model->UnlockIndexBuffer();
// 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;
NxTriangleMeshShapeDesc ShapeDesc;
if(0)
{
// Cooking from file
bool status = NxCookTriangleMesh(TriMeshDesc, UserStream("c:\\tmp.bin", false));
ShapeDesc.meshData = g_pPhysicsSDK->createTriangleMesh(UserStream("c:\\tmp.bin", true));
}
else
{
// 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 = NxVec3(0,0,0);
Actor = g_pScene->createActor(actorDesc);
Actor->userData = (void*)1;
delete[] verts;
delete[] tris;
}