游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2103|回复: 4

有哪位用过PHYSX,请来帮忙看看!

[复制链接]

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2008-12-3 15:56:00 | 显示全部楼层 |阅读模式
我想把我的一个x文件COOK成triangleMesh,结果总是错误,我的函数是这样的:

void GenerateTriangleMeshFromDXMesh(ID3DXMesh* Mesh, NxActor* &amphysXActor, 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);

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-12-3 17:16:00 | 显示全部楼层

Re:有哪位用过PHYSX,请来帮忙看看!

TriMeshDesc.triangleStrideBytes = 3*sizeof(DWORD);

你确认你的索引是32位的吗?
我用的16位NxU16的

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2008-12-4 09:44:00 | 显示全部楼层

Re:有哪位用过PHYSX,请来帮忙看看!

索引搞错了,谢谢!

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2009-2-17 16:34:00 | 显示全部楼层

Re: 有哪位用过PHYSX,请来帮忙看看!

请问怎么解决的 我改索引也是一样的结果

3

主题

263

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2009-2-19 08:12:00 | 显示全部楼层

Re:有哪位用过PHYSX,请来帮忙看看!

路过...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 07:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表