LPD3DXMESH myMesh;
NxTriangleMeshDesc bunnyDesc;
LPDIRECT3DVERTEXBUFFER9 pTempVertexBuffer;
myMesh->GetVertexBuffer(&pTempVertexBuffer);
Vertex *pVertices = NULL;
pTempVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);
bunnyDesc.numVertices = myMesh->GetNumVertices();
bunnyDesc.numTriangles = myMesh->GetNumFaces();
bunnyDesc.pointStrideBytes = myMesh->GetNumBytesPerVertex();
bunnyDesc.triangleStrideBytes = 3*sizeof(float);
bunnyDesc.points = pVertices; //?
// bunnyDesc.triangles = //?
// bunnyDesc.flags = 0; //?
PhysX beginer
Hy, i want to cook a .X file mesh in order to simulate phisics on it on my scene. I folow a beginer tutorial from a site and phisics worked for simple objects like sphere/cube etc..
Now..
Do i need to clone the mesh to get vertices ? But about the triangles parameter ? And the rest of parameters. Are just the faces ? Please point me in the right direction..
there is no need to clone the verts, just itterate through them and take out what you need
vert *ver = NULL;
WORD* Indices;
numOfVerts = (float)mesh->GetNumVertices();
numOfFaces = (float)mesh->GetNumFaces();
mesh->LockVertexBuffer(D3DLOCK_READONLY ,(void**)&ver);
mesh->LockIndexBuffer(D3DLOCK_READONLY ,(LPVOID*)&Indices);
}
for(DWORD i = 0; i < numOfVerts; i++)
{
vertices.push_back(v.x );
vertices.push_back(v.y );
vertices.push_back(v.z);
}
all im doing here is adding the x,y,z component to a std:vector
edit:
and with the faces, there are 3 verts to a face, so you just obtain them like so
D3DXVECTOR3 *face;
for(DWORD i = 0; i < numOfFaces; i++)
{
face = new D3DXVECTOR3[3];
face[0] = ver[Indices[3*i+0]].pos;
face[1] = ver[Indices[3*i+1]].pos;
face[2] = ver[Indices[3*i+2]].pos;
faces.push_back(face);
}
this isnt physx specific by the way, i use this method for Newton physics engine
vert *ver = NULL;
WORD* Indices;
numOfVerts = (float)mesh->GetNumVertices();
numOfFaces = (float)mesh->GetNumFaces();
mesh->LockVertexBuffer(D3DLOCK_READONLY ,(void**)&ver);
mesh->LockIndexBuffer(D3DLOCK_READONLY ,(LPVOID*)&Indices);
}
for(DWORD i = 0; i < numOfVerts; i++)
{
vertices.push_back(v.x );
vertices.push_back(v.y );
vertices.push_back(v.z);
}
all im doing here is adding the x,y,z component to a std:vector
edit:
and with the faces, there are 3 verts to a face, so you just obtain them like so
D3DXVECTOR3 *face;
for(DWORD i = 0; i < numOfFaces; i++)
{
face = new D3DXVECTOR3[3];
face[0] = ver[Indices[3*i+0]].pos;
face[1] = ver[Indices[3*i+1]].pos;
face[2] = ver[Indices[3*i+2]].pos;
faces.push_back(face);
}
this isnt physx specific by the way, i use this method for Newton physics engine
Well it seems would not work what i did with PhysX.
I cooked the mesh file, then i loaded it as an actor in the scene:
1. The mesh that is assigned to the actor doesn move at all in the physcs scene (mesh moves ok with other transformation from PhysX, like a cube for example, but not with my cooked data)
2.It seems i have an invisible actor in the scene but actually much larger than the mesh i cooked.
I dont understand why the mesh isnt moving at all. I mean it should at least move in a wrong way if the cooked data is not correct.
The code
The mesh is ok, the physcs scene is ok too as far as I have other objects like spheres/cubes etc that works.
I cooked the mesh file, then i loaded it as an actor in the scene:
1. The mesh that is assigned to the actor doesn move at all in the physcs scene (mesh moves ok with other transformation from PhysX, like a cube for example, but not with my cooked data)
2.It seems i have an invisible actor in the scene but actually much larger than the mesh i cooked.
I dont understand why the mesh isnt moving at all. I mean it should at least move in a wrong way if the cooked data is not correct.
The code
D3DXLoadMeshFromX(L"C:\\bila.X", D3DXMESH_SYSTEMMEM|D3DXMESH_32BIT, D3DDevice, NULL, NULL, NULL, NULL, &myMesh);NxArray<NxVec3> vertices;NxArray<NxU32> indice;int numOfVerts;int numOfFaces; NxTriangleMeshDesc bunnyDesc;//number of faces and vertices numOfVerts = myMesh->GetNumVertices(); numOfFaces = myMesh->GetNumFaces();//faces and vertices: D3DXVECTOR3 *ver = NULL; WORD* Indices; ver = new D3DXVECTOR3[numOfFaces]; Indices = new WORD[numOfFaces]; myMesh->LockVertexBuffer(D3DLOCK_READONLY ,(void**)&ver); myMesh->LockIndexBuffer(D3DLOCK_READONLY , (LPVOID*)&Indices);// THE FUNCTION FOR D3DXVECTOR TO NXVECTOR3// NxVec3 DXVec3_To_NxVec3(D3DXVECTOR3 DxVector) {// return NxVec3(DxVector.x, DxVector.y, DxVector.z);// } for(DWORD i = 0; i < numOfVerts; i++) { vertices.push_back(DXVec3_To_NxVec3(ver)); } for(DWORD i = 0; i < numOfFaces; i++) { indice.push_back(Indices); } myMesh->UnlockVertexBuffer(); bunnyDesc.numVertices = vertices.size(); bunnyDesc.numTriangles = indice.size()/3; bunnyDesc.pointStrideBytes = sizeof(NxVec3); bunnyDesc.triangleStrideBytes = 3*sizeof(NxU32); bunnyDesc.points = &vertices[0].x; bunnyDesc.triangles = &indice[0]; bunnyDesc.flags = 0; MemoryWriteBuffer buf; gCooking->NxCookTriangleMesh(bunnyDesc, buf);NxTriangleMesh* terrainMesh = gScene->getPhysicsSDK().createTriangleMesh(MemoryReadBuffer(buf.data)); NxTriangleMeshShapeDesc terrainMeshDesc; terrainMeshDesc.meshData = terrainMesh; NxActorDesc actorDesc; actorDesc.shapes.pushBack(&terrainMeshDesc); //a is an actor pointer a = gScene->createActor(actorDesc);
The mesh is ok, the physcs scene is ok too as far as I have other objects like spheres/cubes etc that works.
Later Edit:
I managed to get the cooked data but:
The colission is verry weird for my teapot model. It tryes to colide corecttly but some objects sometimes penetrate it without coliding. Also if Im making a cube it doesnt respond at all at phisics. It just fall thro wall.
http://img216.imageshack.us/img216/420/wtqs0.jpg
I managed to get the cooked data but:
The colission is verry weird for my teapot model. It tryes to colide corecttly but some objects sometimes penetrate it without coliding. Also if Im making a cube it doesnt respond at all at phisics. It just fall thro wall.
http://img216.imageshack.us/img216/420/wtqs0.jpg
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement