Rotations OpenGL autour de World Origin quand elles devraient être autour de Local Origin

J’implémente un système de caméra simple dans OpenGL. J’ai configuré gluPerspective sous la masortingce de projection, puis utilisé gluLookAt sur la masortingce ModelView. Ensuite, ma boucle de rendu principale vérifie la présence d’événements au clavier et, si l’une des touches fléchées est enfoncée, modifie les vitesses angular et avant (je ne fais que pivoter sur l’axe des y et sur le z (avant)). Ensuite, je déplace la vue à l’aide du code suivant (deltaTime est la durée écasting depuis que la dernière image a été rendue en secondes, afin de découpler le mouvement de la quantité d’images par seconde):

//place our camera newTime = RunTime(); //get the time since app start deltaTime = newTime - time; //get the time since the last frame was rendered time = newTime; glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards //draw our vertices draw(); //swap buffers Swap_Buffers(); 

Ensuite, le code tourne à nouveau. Mon algorithme de dessin commence par un glPushMasortingx() et se termine par un glPopMasortingx() .

Chaque appel à glRotatef () et glTranslatef () fait avancer la vue de la vitesse dans la direction de la vue.

Cependant, lorsque je lance le code, mon object est dessiné au bon endroit, mais lorsque je bouge, le mouvement est effectué avec l’orientation de l’origine du monde (0,0,0 – en regard de l’axe Z), par opposition à l’orientation locale. (où je pointe) et quand je tourne, la rotation est faite autour de (0,0,0) et non de la position de la caméra.

Je me retrouve avec cet effet étrange de ma caméra en orbite (0,0,0), par opposition à une rotation sur place.

Je n’appelle pas du tout glLoadIdentity() à l’intérieur de la boucle et je suis sûr que le mode Masortingx est défini sur GL_MODELVIEW pour l’ensemble de la boucle.

Un autre effet étrange est que si je mets un glLoadIdentity() dans la fonction draw( ) (entre les appels PushMasortingx et PopMasortingx, l’écran devient noir et où que je regarde, je ne trouve pas l’object dessiné.

Est-ce que quelqu’un sait ce que je me suis trompé pour faire cette orbite (0,0,0) au lieu de faire une rotation sur place?

glRotate() fait pivoter la masortingce ModelView en fonction de l’origine dans le monde. Ainsi, pour effectuer une rotation autour d’un point quelconque, vous devez convertir votre masortingce pour que ce point soit l’origine, puis effectuer une nouvelle conversion à votre sharepoint départ.

Je pense que tu as besoin de ça

 float x, y, z;//point you want to rotate around glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards glTranslatef(x,y,z); //translate to origin glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate glTranslatef(-x,-y,-z); //translate back //draw our vertices draw(); //swap buffers Swap_Buffers(); 

Echangez votre rotation et traduisez les appels 🙂

Comme ils post-multiplient la stack masortingcielle, le dernier appelé be be est le “premier” à être appliqué conceptuellement, si vous vous souciez de ce genre de chose.

Je pense que vous devez d’abord traduire votre caméra en point (0,0,0), puis la faire pivoter, puis la traduire à l’arrière.