|
|
我想把我的一个x文件COOK成triangleMesh,结果总是错误,我的函数是这样的:
void GenerateTriangleMeshFromDXMesh(ID3DXMesh* Mesh, NxActor* & hysXActor, NxVec3 pos)
{
typedef struct {
D3DXVECTOR3 VertexPos;
D3DXVECTOR3 Normal;
D3DXVECTOR2 TexCoord;
} Mesh_FVF;
//Used to copy indices
typedef struct {
short IBNumber[3];
} IndexBufferStruct;
int NumVerticies = Mesh->GetNumVertices();
int NumTriangles = Mesh->GetNumFaces();
DWORD FVFSize = D3DXGetFVFVertexSize(Mesh->GetFVF());
//Create pointer for vertices
NxVec3* verts = new NxVec3[NumVerticies];
char *DXMeshPtr;
Mesh->LockVertexBuffer(D3DLOCK_READONLY, (void**)&DXMeshPtr);
for(int i = 0; i < NumVerticies; i++)
{
Mesh_FVF *DXMeshFVF = (Mesh_FVF*)DXMeshPtr;
verts = NxVec3(DXMeshFVF->VertexPos.x, DXMeshFVF->VertexPos.y, DXMeshFVF->VertexPos.z);
DXMeshPtr += FVFSize;
}
Mesh->UnlockVertexBuffer();
//Create pointer for indices
IndexBufferStruct *tris = new IndexBufferStruct[NumTriangles];
IndexBufferStruct *DXMeshIBPtr;
Mesh->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];
}
Mesh->UnlockIndexBuffer();
// Build physical model
NxTriangleMeshDesc TriMeshDesc;
TriMeshDesc.numVertices = NumVerticies;
TriMeshDesc.numTriangles = NumTriangles;
TriMeshDesc.pointStrideBytes = sizeof(NxVec3);
TriMeshDesc.triangleStrideBytes = 3*sizeof(short);
TriMeshDesc.points = verts;
TriMeshDesc.triangles = tris;
TriMeshDesc.flags = NX_MF_16_BIT_INDICES;
NxTriangleMeshShapeDesc ShapeDesc;
{
// Cooking from memory
MemoryWriteBuffer buf;
bool status = NxCookTriangleMesh(TriMeshDesc, buf); //这句代码返回true;
ShapeDesc.meshData = gPhysicsSDK->createTriangleMesh(MemoryReadBuffer(buf.data));//可恶的是这句 代码返回的是0,也就是ShapeDesc.meshData == 0x00000000,不知道为什么会这样?
}
NxActorDesc actorDesc;
actorDesc.shapes.pushBack(&ShapeDesc);
actorDesc.globalPose.t = pos;
PhysXActor = gScene->createActor(actorDesc);
PhysXActor->userData = (void*)1;
delete[] verts;
delete[] tris;
}
然后我自己手动写了一个三角形,并设置该三角形的顶点和索引数据,最后再COOK成triangleMesh,代码如下:
//三角形三个顶点(9个数据)
NxReal* verts = new NxReal[9];
for(int i=0; i<9;i++)
{
verts = i;
}
//三角形三个点的索引
DWORD* index = new DWORD[3];
index[0] = 0;
index[1] = 1;
index[2] = 2;
// Build physical model
NxTriangleMeshDesc TriMeshDesc;
TriMeshDesc.numVertices = 3;
TriMeshDesc.numTriangles = 1;
TriMeshDesc.pointStrideBytes = sizeof(NxVec3);
TriMeshDesc.triangleStrideBytes = 3*sizeof(DWORD);
TriMeshDesc.points = verts;
TriMeshDesc.triangles = index;
TriMeshDesc.flags = 0;
if(!TriMeshDesc.isValid())
{
return;
}
NxTriangleMeshShapeDesc ShapeDesc;
// Cooking from memory
NxInitCooking();
MemoryWriteBuffer buf;
bool status = NxCookTriangleMesh(TriMeshDesc, buf); //这句代码就返回false,不知道为什么?
MemoryReadBuffer readBuffer(buf.data);
ShapeDesc.meshData = gPhysicsSDK->createTriangleMesh(readBuffer);
|
|