2015-12-15 1 views
1

J'ai un problème avec ce code openGL:objet en rotation OpenGL autour de l'axe global, tangage et roulis

 make3D(); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glClearColor(0.5f, 0.55f, 0.55f, 1.0f); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
     GLU.gluLookAt(camX, camY, camZ, centerX, centerY, centerZ, upX, upY, upZ); 

     // THE PROBLEM IS SOMEWHERE HERE 
     // Rotate and render vehicle 
     GL11.glPushMatrix(); 
     GL11.glTranslatef(0.0f, 0f, 0.0f); 
     GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f); 
     GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f); 
     GL11.glTranslatef(-0.0f, -0f, -0.0f); 
     scene.render(ObjectType.VEHICLE); 
     GL11.glPopMatrix(); 

     // Render floor 
     GL11.glPushMatrix(); 
     GL11.glRotatef(vehicleCourse, 0.0f, 1.0f, 0.0f); 
     GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
     scene.render(ObjectType.ENVIROMENT_FLOOR); 
     GL11.glPopMatrix(); 

     // Draw lights 
     setUpLighting(); 

rotation du rouleau semble correct, l'objet tourne sur son côté (juste roule), mais ne marche pas de rotation de hauteur travailler comme prévu. Si je roule mon objet d'abord de 30 degrés, puis que je le fais pivoter de 30 degrés, je voudrais qu'il soit roulé et qu'il soit incliné de 30 degrés, mais il fait tourner mon objet par un vecteur de ces deux-là, à la fin il ressemble 15 degrés pitch et 15 degrés roll et change également son cap.

tl; dr ce code ne se déplace mon objet par son propre axe, un par un et j'ai besoin de tourner autour du point de orgin, pas chaning et rouler sans changer son cap

En dehors de ce que le deuxième objet (étage), est à tourner à un cours donné, et cela fonctionne bien. Le véhicule est le problème.

J'ai déjà essayé de ne pas appeler translateF, ou d'appeler des rotations et de traduire f, puis de les rappeler avec des valeurs négatives, rien ne semblait vraiment fonctionner.

modifier: a ajouté la vidéo youtube visualsing mon problème, ou plutôt l'effet im essayant d'atteindre https://www.youtube.com/watch?v=zc8b2Jo7mno&feature=youtu.be&t=111

Répondre

1

Après avoir passé quelques heures à la lecture sur les euler agles et de quaternion, quand je presque abandonné je soudain eu une épiphanie. Pour obtenir les choses qui travaillent dans mon cas, il suffisait d'échanger deux lignes de code:

que:

GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f); 
GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f); 

que:

GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f); 
GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f);