Bonjour !

J'essaye actuellement d'avoir des collisions entre des particules fluides (PxParticleFluid) et des maillages triangulés avec un PxTriangleMeshGeometry.

J'ai quelques soucis. Tout d'abord voici ma fonction de chargement de fichier obj qui marche parfaitement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
void MeshLoader::loadMesh()
{
    ifstream f(fileName);
    char line[255];
 
    while(f.good())
    {
        f.getline(line,255);
        istringstream iss(line);
        string firstWord;
        iss>>firstWord;
 
        if(firstWord == "v")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            pos.push_back(v);
        }
 
        if(firstWord == "vn")
        {
            PxVec3 v;
            iss>>v.x;
            iss>>v.y;
            iss>>v.z;
            normals.push_back(v);
        }
 
        if(firstWord == "f")
        {
            string t1,t2,t3;
            int it1, it2, it3;
 
            iss>>t1;
            iss>>t2;
            iss>>t3;
 
            sscanf(t1.c_str(),"%d//",&it1);
            sscanf(t2.c_str(),"%d//",&it2);
            sscanf(t3.c_str(),"%d//",&it3);
 
            indices.push_back(it1);
            indices.push_back(it2);
            indices.push_back(it3);
        }
 
    }
    f.close();
}
Ensuite je crée mon acteur statique à partir du maillage :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
void Simulator::addTriangleMesh(std::string file)
{
    vector<PxVec3> pos, normals;
    vector<PxU32>  indices;
 
    MeshLoader *m = new MeshLoader(file);
    m->loadMesh();
 
    pos = m->getPos();
    normals = m->getNormals();
    indices = m->getIndices();
 
    PxTriangleMeshDesc meshDesc;
 
    meshDesc.points.count = pos.size();
    meshDesc.points.stride = sizeof(PxVec3);
    meshDesc.points.data = pos.data();
 
    meshDesc.triangles.count = indices.size()/3;
    meshDesc.triangles.stride = 3*sizeof(PxU32);
    meshDesc.triangles.data = indices.data(); //OK mais il faut pouvoir lire un buffer de PxU32 par pas de 1*sizeof(PxU32) et non pas 3*
 
    PxDefaultMemoryOutputStream writeBuffer;
    mCooking->cookTriangleMesh(meshDesc, writeBuffer);
 
    //mesh creation
    PxDefaultMemoryInputData readBuffer = PxDefaultMemoryInputData(writeBuffer.getData(), writeBuffer.getSize());
    PxTriangleMesh * tm = mPhysics->createTriangleMesh(readBuffer);
 
    //actor
    PxRigidStatic *meshActor = mPhysics->createRigidStatic(PxTransform());
    PxTriangleMeshGeometry *meshGeo = new PxTriangleMeshGeometry(tm);
    PxShape *meshShape = meshActor->createShape(*meshGeo, *(mPhysics->createMaterial(0.5,0.5,0.5)));
    mScene->addActor(*meshActor);
    actors.push_back(meshActor);
    triangulatedObjects.push_back(m);
}
Le problème surgit lors de la simulation. Lorsque j'essaye de lire mon maillage comme ci-dessous, sur un cube comportant 8 sommets et 12 triangles, voici ce que le code suivant m'affiche :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
if(shapes[i]->getGeometryType()  == PxGeometryType::eTRIANGLEMESH)
                    {
                        epv->exportMesh(sim->getInstance().triangulatedObjects[0]->getPos(), 
                                        sim->getInstance().triangulatedObjects[0]->getIndices());
                        PxTriangleMeshGeometry ptmg;
                        shapes[i]->getTriangleMeshGeometry(ptmg);
 
                        vector<PxVec3> v;
 
                        cout<<"nbVertices "<<ptmg.triangleMesh->getNbVertices()<<endl;
                        for(int k = 0; k < ptmg.triangleMesh->getNbVertices(); k++)
                        {
                            v.push_back(ptmg.triangleMesh->getVertices()[k]);
                            cout<<" k="<<k<<" "<<v[v.size()-1]<<endl;
                        }
 
                        vector<PxU32> indexes;
                        const PxU32 *ind;
 
                        ind = (const PxU32*)(ptmg.triangleMesh->getTriangles());
 
                        cout<<"nbTriangle="<<ptmg.triangleMesh->getNbTriangles()<<endl;
 
                        for(int k=0;k<ptmg.triangleMesh->getNbTriangles();k++)
                        {
                            indexes.push_back(ind[k]);
                            cout<<" i="<<indexes[indexes.size()-1]<<endl;
                        }
                    }
Résultat :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
nbVertices 7
 k=0 x: 1.98481 y: 0.490434 z: -1.98481
 k=1 x: 1.98481 y: 4.46006 z: -1.98481
 k=2 x: -1.98481 y: 4.46006 z: -1.98481
 k=3 x: -1.98481 y: 0.490434 z: 1.98481
 k=4 x: -1.98481 y: 4.46005 z: 1.98481
 k=5 x: 1.98481 y: 0.490434 z: 1.98481
 k=6 x: 1.98481 y: 4.46005 z: 1.98481
nbTriangle=7
 i=4
 i=196611
 i=131072
 i=65536
 i=65538
 i=262144
 i=196612
Les 7 premiers sommets sont corrects, le 8è est absent. Il manque 5 triangles et les 7 déjà présents sont tous incohérents, voici mon box.obj d'origine :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
# Blender v2.62 (sub 0) OBJ File: ''
# www.blender.org
mtllib box.mtl
o Mesh_Cube.001
v -1.984811 0.490434 -1.984812
v 1.984811 0.490434 -1.984811
v 1.984812 4.460056 -1.984810
v -1.984811 4.460056 -1.984811
v -1.984812 0.490434 1.984811
v -1.984812 4.460055 1.984811
v 1.984811 0.490434 1.984811
v 1.984810 4.460055 1.984813
vn -0.000000 -0.000000 1.000000
vn 1.000000 -0.000000 0.000000
vn 0.000000 0.000001 -1.000000
vn 0.000001 0.000000 -1.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 -0.000000 -0.000001
vn 0.000000 -1.000000 -0.000000
vn 0.000000 1.000000 0.000000
usemtl Material.001
s off
f 1//1 2//1 3//1
f 4//1 1//1 3//1
f 5//2 4//2 6//2
f 5//2 1//2 4//2
f 7//3 5//3 8//3
f 8//4 5//4 6//4
f 2//5 7//5 3//5
f 3//6 7//6 8//6
f 3//7 8//7 4//7
f 4//7 8//7 6//7
f 2//8 5//8 7//8
f 2//8 1//8 5//8
Bien entendu, les collisions ne fonctionnent pas. Toute aide me sera précieuse !

Merci d'avance !

Muska17