Salut à tous,
J'ai récemment découvert les tutoriaux sur Newton et je me suis dit que ca serait cool de l'intégrer à mon moteur 3D. Le moteur 3D dispose d'une classe qui gère des BSP et d'une classe qui gère des déplacement à pieds (genre FPS). Je me suis dis qu'en entourant ma caméra d'une sphère et en utilisant NewtonTreeCollision, j'arriverais probablement à un résultat meilleur que mes fonctions de collisions faite maison. Je me suis donc lancé dans l'aventure, mais je traverse les murs :\. C'est balo...
Je suis certain que c'est moi qui utilise mal le moteur et donc toute information complémentaire me sera utile.
La partie sur les TreeCollision me semble ok. Pour moi le probleme viens de la caméra mais je donne tout le code au cas ou...
Fonction BSP::Load()
Constructeur de la caméra:
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 ... NewtonCollision * nCollision = NULL; NewtonWorld *nWorld=GSEPhysic->GetWorld(); nCollision = NewtonCreateTreeCollision (nWorld, NULL); NewtonTreeCollisionBeginBuild (nCollision); GLint strideInBytes = sizeof(GLfloat) * 3; ... GLfloat *fVert=new GLfloat [polygonFaces[currentFace].numVertices*3]; int vertexIndex=0; for(int indice=0;indice<polygonFaces[currentFace].numVertices*3;indice+=3) { fVert[indice]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.x; fVert[indice+1]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.y; fVert[indice+2]=vertices[polygonFaces[currentFace].firstVertexIndex+vertexIndex].position.z; vertexIndex++; } NewtonTreeCollisionAddFace (nCollision, polygonFaces[currentFace].numVertices, &fVert[0], strideInBytes, 0); delete [] fVert; ... NewtonTreeCollisionEndBuild (nCollision, 1); m_pBody = NewtonCreateBody (nWorld, nCollision); NewtonReleaseCollision (nWorld, nCollision);
Fonction Update de la caméra:
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 ... NewtonWorld *nWorld=GSEPhysic->GetWorld(); NewtonCollision * nCollision = NULL; nCollision = NewtonCreateSphere (nWorld, 0.25, 0.25, 0.25, NULL); m_pBody = NewtonCreateBody (nWorld, nCollision); NewtonReleaseCollision (nWorld, nCollision); GSEMATRIX4X4 matrice; matrice.LoadIdentity(); // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 matrice.entries[14]=2.0;// float entries[16] NewtonBodySetMatrix(m_pBody, &matrice.entries[0]); NewtonBodySetMassMatrix(m_pBody, 15.0, 10.0, 10.0, 10.0); NewtonBodySetForceAndTorqueCallback (m_pBody, ForceAndTorqueCallback);
La callback ForceAndTorqueCallback
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 ... GSEMATRIX4X4 matrice; matrice.LoadIdentity(); matrice.entries[12]=objCamera.mPos.x; matrice.entries[13]=objCamera.mPos.y; matrice.entries[14]=objCamera.mPos.z; //Modification de la position de la sphere dans Newton NewtonBodySetMatrix (m_pBody, &matrice.entries[0]); //A partir de la les 4 ligne qui suivent me paraissent bien bete //Mais je ne sais pas quoi mettre pour que la camera s'arrete lorsqu'elle //Rencontre un mur NewtonBodyGetMatrix (m_pBody, &matrice.entries[0]); glPushMatrix (); glMultMatrixf (&matrice.entries[0]); glPopMatrix(); ...
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 static void ForceAndTorqueCallback (const NewtonBody * nBody) { float fMasse; float InertieX,InertieY,InertieZ; NewtonBodyGetMassMatrix (nBody, &fMasse, &InertieX, &InertieY, &InertieZ); float force[3]={0.0f,-fMasse*9.81,0.0f}; NewtonBodyAddForce (nBody, force); }
Partager