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 :
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
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(); }
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
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); }
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
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; } }
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 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
Bien entendu, les collisions ne fonctionnent pas. Toute aide me sera précieuse !
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
Merci d'avance !
Muska17
Partager