[OpenGL] Orientation d'un objet

Hello !!!
 
J’ai un problème en OpenGL. Voilà, c’est simple, j’essaie d’orienter un objet avec la même orientation que la surface (qui est un mesh) sur lequel il repose.
 
J’ai calculé toutes les normales aux faces de mon mesh et j’y accède juste ça pas de problème (donc pas besoin de me me dire : controle tes normales, elles sont certifiées) … ce que j’ai du mal à faire, enfin où je pense qu’il y a l’erreur c’est pour calculer les angles des deux rotations qui correspondent au 4ème et 5ème degrés de liberté d’un solide indéformable. Donc à partir de la normale je calcule les deux angles en question avec le thérorème du cosinus …
 
Alors voilà, des fois ça marche, et des fois pas, et tout ça ça pue les irrégularitées des fonctions du genre acos !!! J’ai rajouté à la louche des ± M_PI/2, ça marche un peu mieux, mais pas encore top …
 
Alors voilà, je pense que si des gens ont déjà fait de l’OpenGL avant, ils vont me sortir ça facilement et moi j’arrive plus à trouver des erreurs dans ce code que voici (l’endroit où je calcule les angles fatidiques) :

yrob = get_ground_high(xrob, zrob, ground_points, ground_flat_normals, NB_WIDTH);  
get_smoothed_ground_normal(xrob, zrob, ground_flat_normals, last_normals, normalerob, NB_WIDTH, SMOOTH_SIZE);
 
directionrob[0] = cos(anglerob_yM_PI /180);  
directionrob[1] = 0.;  
directionrob[2] = sin(anglerob_y
M_PI /180);  

directionrobOrtho[0] = - directionrob[2];  
directionrobOrtho[1] = 0.;  
directionrobOrtho[2] = directionrob[0];  

anglerob1 = acos(dotProduct(directionrobOrtho, normalerob) / (norme(directionrobOrtho) * norme(normalerob))) -(M_PI/2);  

// il faut faire un test sur le sinus pour savoir si le signe de l’angle est juste  
/* produitVectoriel(init, directionrobOrtho, normalerob, directionTemp);
if (directionTemp[1] < 0.) {  
// on a le sinus négatif : vecteur négatif en y  
anglerob1 = -anglerob1; } */  
anglerob1 = anglerob1 * 180 / M_PI;  

anglerob2 = acos(dotProduct(directionrob, normalerob) / (norme(directionrob) * norme(normalerob))) -(M_PI/2);  
/* produitVectoriel(init, directionrob, normalerob, directionTemp); if (directionTemp[1] < 0.) {  
// on a le sinus négatif : vecteur négatif en y  
anglerob2 = -anglerob2; } */  
anglerob2 = anglerob2 * -180 / M_PI;

 
Ce message a été édité par Longfield le 16/06/2004

Juste pour être sûr de bien comprendre ton problème :

Tu as une surface, on va l’appeler le sol. Tu as un objet que tu veux poser sur le sol. Tu cherches comment orienter cet objet pour qu’il soit “bien posé”.

Tout d’abord, il faut savoir sur quelle face ton objet doit être posé. Ensuite, tu as les normales de cette face, et la normale du sol. Le but est d’avoir les deux normales de sorte que (n1 == -n2). Tu dois calculer la transformation nécessaire pour aligner l’objet avec la normale de la face sur laquelle il repose. Une fois que tu as cette transformation, tu l’inverse et tu démarres avec l’opposée de la normale du sol.

Je sais pas si ça aide beaucoup… Je suis loin d’être un gourou en 3D

edit : tiens, et en me relisant je me rends compte que c’est totalement incompréhensible… pourtant quand je l’ai écrit ça m’a semblé clair
Ce message a été édité par Drealmer le 16/06/2004

Voilà, trouver la face en dessous de l’objet et la bonne normale c’est ok …

ce qui me manque c’est les deux angles cette normale et la verticale projetés dans les plans adéquats pour que je puisse faire mes deux GLRotatef avec les axes correspondant !!!

Et le bout de code moche que j’ai essayé de mettre en haut et qui a merdé (j’ai pas encore tout capté pour poster sur ce forum) c’est justement le code qui calcules les deux angles pour les GLRotate … je suis vraiment super désolé que ça sorte si mal que ça !!!

En fait la réponse à tous ces problèmes de rotations est souvent la même : jettes un oeil du côté des quaternions… Ca a l’air horriblement compliqué, et ça l’est, mais y’a plein de “formules magiques” sur internet. Tape un peu “quaternion faq” sur google et tu vas trouver plein d’algorithmes qui tiennent en trois lignes et qui font tout ce dont tu peux rêver et même plus.

De toutes façons, avec les rotations décomposées, on tombe toujours à un moment ou un autre sur le fameux “gimbal lock” et bardaf c’est l’embardée.

edit : ah et au fait, le prochain coup tu devrais mettre ton post dans “segmentation fault” et pas dans “gribouillage”, le premier c’est le forum pour les programmeurs, l’autre pour les graphistes. Je dis juste ça pour que tu maximimes les chances que ton post soit lu par les personnes les plus suceptibles de t’aider.
Ce message a été édité par Drealmer le 16/06/2004

surement, mais là je peux pas changer toute la structure de mon programme  qui est devenu trop gros … Mais promis la prochaine fois j’y penserai …

Mais sinon, pas une idée pour mon cas ???

Pas obligé de tout changer, y’a des formules assez simples pour passer des angles eulériens vers un quaternion et l’inverse… L’idée est de juste utiliser les quaterninons pour ce calcul-là.

ok, ben j’ai eu 2-3 idées dans le train en rentrant à la maison, je vais chercher encore un peu des fautes dans mon implémentation, et si je ne trouve rien je vais jeter un coup d’oeil du côté des quaternions …

j’ai toujours pas réussi à faire mieux … en fait ce qu’il me faudrait après des recherches c’est calculer la matrice de rotation qui me donnerait exactement la même orientation qu’un vecteur donné, et ensuite appliquer cette matrice à la matrice standart OpenGL … quelqu’un sait-il faire ça ???

c’est bon, en me creusant bien la tête, mais alors vraiment bien, j’ai réussi à cacluler la matrice et grâce à la fonction glMultMatrixf je peux l’appliquer directement à ma matrice OpenGL

Ah ben félicitations Mais tant que j’y suis dans les conseils relatifs à la Cafzone, évite de te répondre à toi-même… C’est très mal vu, je l’ai fait une seule fois, et j’ai failli me faire dépecer vivant par Glop. On dirait pas, mais l’agent 47 c’est un teletubbies comparé à Glop.

ok ben je saurai …

 mais bon ça dérange pas énormément et le but n’est pas de remonter le thread mais bien d’apporter de nouvelles infos. Mais promis à l’avenir j’essairai d’éviter !

moi je voudrais bien savoir ce que se thread fout ici ?