Bonjour à tous,
Je cherche depuis quelques temps à intégrer Newton à mon loader de md2 sans succès.
Pour vous donner une idée de l'organisation des données de mon loader voici la méthode qui affiche une frame:
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
|
void Md2Model::renderFrameImmediate (int frame)
{
// Compute max frame index
int maxFrame = _header.num_frames - 1;
// Check if the frame index is valid
if ((frame < 0) || (frame > maxFrame))
return;
// Bind to model's texture
if (_tex)
_tex->bind ();
glBegin (GL_TRIANGLES);
// Draw each triangle
for (int i = 0; i < _header.num_tris; ++i)
{
// Draw each vertex of this triangle
for (int j = 0; j < 3; ++j)
{
Md2Frame_t *pFrame = &_frames[frame];
Md2Vertex_t *pVert = &pFrame->verts[_triangles[i].vertex[j]];
Md2TexCoord_t *pTexCoords = &_texCoords[_triangles[i].st[j]];
// Compute final texture coords.
GLfloat s = static_cast<GLfloat>(pTexCoords->s) / _header.skinwidth;
GLfloat t = static_cast<GLfloat>(pTexCoords->t) / _header.skinheight;
glTexCoord2f (s, 1.0f - t);
// Send normal vector to OpenGL
glNormal3fv (_kAnorms[pVert->normalIndex]);
// Uncompress vertex position and scale it
vec3_t v;
v[0] = (pFrame->scale[0] * pVert->v[0] + pFrame->translate[0]) * _scalex;
v[1] = (pFrame->scale[1] * pVert->v[1] + pFrame->translate[1]) * _scaley;
v[2] = (pFrame->scale[2] * pVert->v[2] + pFrame->translate[2]) * _scalez;
glVertex3fv (v);
}
}
glEnd();
} |
Je suis le tutorial de developpez.com sur les enveloppes convexes. Je me suis donc dit que en reprenant le code d'affichage d'une frame et en considérant que mon objet 3D equivaux à un mesh, j'arriverais à faire intéragir mes objets avec la physique.
Voici la fonction à laquelle je suis arrivé:
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 Md2Player::CreateNewtonModel(Md2ModelPtr model)
{
NewtonCollision * nCollision = NULL;
std::vector <NewtonCollision *> enveloppeConvexe;
NewtonWorld *nWorld=GSEPhysic->GetWorld();
vector<GSEPOINT3D> triangle;
for (int i = 0; i < model->_header.num_tris; ++i)
{
// Draw each vertex of this triangle
for (int j = 0; j < 3; ++j)
{
Md2Frame_t *pFrame = &model->_frames[0];
Md2Vertex_t *pVert = &pFrame->verts[model->_triangles[i].vertex[j]];
vec3_t v;
v[0] = (pFrame->scale[0] * pVert->v[0] + pFrame->translate[0]) * model->_scalex;
v[1] = (pFrame->scale[1] * pVert->v[1] + pFrame->translate[1]) * model->_scaley;
v[2] = (pFrame->scale[2] * pVert->v[2] + pFrame->translate[2]) * model->_scalez;
GSEPOINT3D point=GSEPOINT3D(v[0],v[1],v[2]);
triangle.push_back(point);
}
}
nCollision = NewtonCreateConvexHull (nWorld, triangle.size(), &triangle[0].x, sizeof (GSEPOINT3D)* 3 , NULL);
enveloppeConvexe.push_back (nCollision);
nCollision = NewtonCreateCompoundCollision (nWorld, model->_header.num_tris, &enveloppeConvexe[0]);
m_pBody = NewtonCreateBody (nWorld, nCollision);
if (m_pBody == NULL)
{
std::cerr << "Impossible de créer le corps Newton";
}
int size=enveloppeConvexe.size();
for(int i=0;i<size;i++)
{
NewtonReleaseCollision(nWorld,enveloppeConvexe[i]);
}
NewtonReleaseCollision (nWorld, nCollision);
} |
Mais lorsque j'execute ce code, le programme plante sur la ligne:
nCollision = NewtonCreateConvexHull (nWorld, triangle.size(), &triangle[0].x, sizeof (GSEPOINT3D)* 3 , NULL);
sans explications apparentes (nWorld a une valeur, triangle.size() vaut 1761,...)
J'ai donc modifié ma fonction et j'ai considéré que 1 mesh = 1 triangle. Meme résultat plantage sur la méthode NewtonCreateConvexHull.
J'ai donc réalisé un programme de test. Ce programme charge dans Newton 4 vertices et passe ces vertices dans la fonction NewtonCreateConvexHull. Et là surprise ca marche. J'ai ensuite retiré du chargement un des 4 vertex et là plantage à nouveau.
J'ai fais des recherche sur google de mon problème. Le résultat a été des liens vers des topics du forum de Newton mais tous les liens sont mort.
Il y a peut etre un bug dans la fonction NewtonCreateConvexHull mais j'en doute. Je pense plutot que j'utilise mal les fonctions et c'est donc pour ca que je sollicite votre aide. J'aimerais donc savoir comment je peux charger correctement dans Newton un modèle md2?
Merci.
Partager