Autor Wątek: PhysX i NxConvexMeshDesc  (Przeczytany 545 razy)

Offline yoyuu

  • Użytkownik

# Listopad 08, 2009, 15:57:04
Mam takie dwie funkcje:

NxActor *CreateConvex(const NxVec3& pos, const NxVec3& boxDim, const NxReal density, NxVec3 &ov)
{
...

NxConvexMeshDesc *convexDesc = new NxConvexMeshDesc();
assert(convexDesc);
    convexDesc->numVertices = numVertices;
    convexDesc->pointStrideBytes = sizeof(Vertex);
    convexDesc->points = vertices;
convexDesc->flags = NX_CF_COMPUTE_CONVEX;
convexDesc->numTriangles = numTriangles;
convexDesc->triangles = indices;
convexDesc->triangleStrideBytes = 3 * sizeof(DWORD);

NxConvexShapeDesc convexShapeDesc;
convexShapeDesc.localPose.t = NxVec3(0,boxDim.y,0);
convexShapeDesc.userData = convexDesc;
 
NxInitCooking();
MemoryWriteBuffer buf;
bool status = NxCookConvexMesh(*convexDesc, buf);
NxConvexMesh *pMesh = physicsSDK->createConvexMesh(MemoryReadBuffer(buf.data));
assert(pMesh);
convexShapeDesc.meshData = pMesh;
NxCloseCooking();

    if (pMesh)
    {
pMesh->saveToDesc(*convexDesc);
NxActorDesc actorDesc;
assert(convexShapeDesc.isValid());
        actorDesc.shapes.pushBack(&convexShapeDesc);
    actorDesc.body = &bodyDesc;
actorDesc.density = 10.0f;
   
        actorDesc.globalPose.t  = NxVec3(0.0f, 0.0f, 0.0f);
assert(actorDesc.isValid());
NxActor* actor = scene->createActor(actorDesc);

assert(actor);
return actor;
}

...

}

oraz

void DrawConvex(NxShape* mesh, bool useShapeUserData, D3DXMATRIX mW, D3DXMATRIX mWVP)
{
NxConvexMeshDesc meshDesc;
mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc);

int nbVerts = meshDesc.numVertices;

Vertex *vertices = (Vertex*)meshDesc.points;
DWORD *indices = (DWORD*)meshDesc.triangles;

...

}

Problem polega na tym, że w funkcji CreateConvex zmienna numVertices wynosi 22, a w funkcji DrawConvex, gdy pobieram ilość wierzchołków to dostaję 8. Dlaczego 8 a nie 22? Podobnie mam z pozostałymi danymi - Również są nieprawidłowe. Przez to nie mogę poprawnie narysować obiektów. Zauważyłem, że liczba wierzchołków zmienia się na niewłaściwą po wykonaniu linijki: pMesh->saveToDesc(*convexDesc);. Dlaczego tak się dzieje i jak to można poprawić?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Dab

  • Redaktor
    • blog

# Listopad 08, 2009, 16:07:34
Przede wszystkim nie powinieneś czytać danych z convexa, tylko skorzystać z danych których użyłeś do jego zbudowania.

W trakcie budowania convexa PhysX konwertuje punkty na otoczkę wypukłą i może usuwać zbędne punkty.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 08, 2009, 16:40:50
Poza tym PhysX może też sobie optymalizuje siatkę łącząc punkty leżące w tym samym miejscu. W końcu dla niego potrzebne są tylko pozycje wierzchołków. Jeśli podajesz mu po kilka wierzchołków w różnym miejscu, bo takie siatki często stosuje się do renderowania (pozycja ta sama, a różne np. wektory normalne czy współrzędne tekstury), to pewnie je połączy.