2008-08-23 9 views
10

J'essaye de faire une simple rotation dans OpenGL mais il faut manquer le point. Je ne suis pas à la recherche d'une solution spécifique, mais plutôt d'une explication rapide ou d'un lien qui explique plus généralement la rotation OpenGL.OpenGL Rotation

Au moment où j'ai le code comme ceci:

glPushMatrix(); 
    glRotatef(90.0, 0.0, 1.0, 0.0); 
    glBegin(GL_TRIANGLES);   
    glVertex3f(1.0, 1.0, 0.0);   
    glVertex3f(3.0, 2.0, 0.0);   
    glVertex3f(3.0, 1.0, 0.0);   
    glEnd(); 
glPopMatrix(); 

Mais le résultat n'est pas un triangle tourné à 90 degrés.

Modifier Hmm grâce à Mike Haboustak - il est apparu mon code appelait une fonction de SetCamera qui utilisent glOrtho. Je suis trop nouveau à OpenGL pour avoir une idée de ce que cela signifiait mais la désactiver et tourner dans l'axe Z a produit le résultat souhaité.

Répondre

6

Obtenez-vous une ligne droite d'1 unité? Il semble que 90deg pourriture. autour de Y va vous faire regarder le côté d'un triangle sans profondeur.

Vous devriez essayer de tourner autour de l'axe Z à la place et voir si vous obtenez quelque chose qui a plus de sens.

OpenGL a deux matrices liées à l'affichage de la géométrie, le ModelView et la projection. Les deux sont appliqués aux coordonnées avant que les données deviennent visibles sur l'écran. La matrice ModelView est d'abord appliquée, transformant les données de l'espace objet en espace de vue. Ensuite, la matrice de projection est appliquée avec transforme les données de l'espace de vue pour "projection" sur votre moniteur 2D. ModelView est utilisé pour positionner plusieurs objets à leur emplacement dans le "monde", Projection est utilisé pour positionner les objets sur l'écran.

Votre code semble bien, donc je suppose que de la lecture de la documentation vous savez quelle est la nature des fonctions comme glPushMatrix(). Si la rotation autour de Z n'a toujours aucun sens, vérifiez que vous modifiez la matrice ModelView en appelant glMatrixMode.

+0

IMPORTANT! Voir aussi la réponse de Perry ci-dessous. – Ali

6

Assurez-vous que vous modifiez la matrice de modelview en mettant les points suivants avant l'appel glRotatef:

glMatrixMode(GL_MODELVIEW); 

Sinon, vous pouvez modifier ni la projection ou une matrice de texture au lieu.

1

Lorsque j'ai regardé OpenGL pour la première fois, les NeHe tutorials (voir le menu de gauche) ont été d'une valeur inestimable.

1

Je voudrais recommander un livre:

3D Computer Graphics : A Mathematical Introduction with OpenGL par Samuel R. Buss

Il fournit des explications très claires, et les mathématiques sont largement applicables à des domaines non graphiques. Vous trouverez également une description détaillée des projections orthographiques par rapport aux transformations de perspective.

1

En ce qui concerne la matrice de projection, vous pouvez trouver une bonne source pour commencer ici:

http://msdn.microsoft.com/en-us/library/bb147302(VS.85).aspx

Il explique un peu sur la façon de construire un type de matrice de projection.La projection orthographique est la forme très basique/primitive d'une telle matrice et fondamentalement ce que fait c'est de prendre 2 des 3 axes et de les projeter à l'écran (vous pouvez toujours retourner les axes et les redimensionner mais pas de distorsion) .

transformation des matrices est très probablement l'une des choses les plus importantes lors du rendu en 3D et consiste essentiellement à 3 étapes de la matrice:

  • Transform1 = Objet système de coordonnées World (par exemple - rotation des objets et échelle)
  • Transform2 = système mondial de coordonnées de caméra (positionnement de l'objet à la bonne place)
  • Transform3 = système de coordonnées Caméra à l'espace de l'écran (en saillie à l'écran)

Habituellement, le résultat de la multiplication matricielle est appelé matrice WorldViewProjection (si vous tombez sur ce terme), car il transforme les coordonnées de l'espace Modèle en Monde, puis en Caméra et enfin en représentation à l'écran.

Amusez-vous

5

La « réponse acceptée » n'est pas tout à fait correcte - tournant autour du Z ne sera pas vous aider à voir ce triangle à moins que vous avez fait des choses étranges avant ce code. Suppression d'un appel glOrtho (...) peut avoir corrigé le problème dans ce cas, mais vous avez encore quelques autres problèmes.

Deux problèmes majeurs avec le code comme écrit:

  • Avez-vous déjà trouve la caméra? En OpenGL, la caméra est située à l'origine, en regardant vers le bas sur l'axe Z, avec Y positif en haut. Dans ce cas, le triangle est dessiné dans le même plan que votre œil, mais vers le haut et vers la droite. Sauf si vous avez une matrice de projection très étrange, vous ne le verrez pas. gluLookat() est la commande la plus facile à faire, mais n'importe quelle commande qui déplace la matrice courante (qui devrait être MODELVIEW) peut être mise au travail.

  • Vous dessinez le triangle dans le sens des aiguilles d'une montre, ou dans le sens des aiguilles d'une montre, alors que la valeur par défaut pour OpenGL est un système de coordonnées droitier ou antihoraire. Cela signifie que, si vous supprimez des faces arrière (ce qui n'est probablement pas le cas, mais qui passera probablement à mesure que vous progressez), vous ne verrez pas le triangle comme prévu. Pour voir le problème, placez votre main droite devant votre visage et, imaginant que c'est dans le plan XY, déplacez vos doigts dans l'ordre où vous dessinez les sommets (1,1) à (3,2) à (3,1). Lorsque vous faites cela, votre pouce est tourné vers l'extérieur de votre visage, ce qui signifie que vous regardez à l'arrière du triangle. Vous devez prendre l'habitude de dessiner des visages dans une méthode de droitier, puisque c'est la façon habituelle de le faire dans OpenGL.

La meilleure chose que je peux recommander est d'utiliser les tutoriels NeHe - http://nehe.gamedev.net/. Ils commencent par vous montrer comment configurer OpenGL dans plusieurs systèmes, se déplacent sur des triangles de dessin, et continuent lentement et sûrement vers des sujets plus avancés. Ils sont très faciles à suivre.