Question

En utilisant OpenGL je tente de dessiner une carte primitive de mon campus.

Quelqu'un peut-il me expliquer comment le panoramique, le zoom et la rotation est généralement mis en œuvre?

Par exemple, avec panoramique et de zoom, est que moi tout simplement ajuster ma fenêtre? Donc, j'intrigue et dessine toutes mes lignes qui composent ma carte, puis comme l'utilisateur clique et fait glisser il ajuste ma fenêtre?

Pour panning, faut-il déplacer les valeurs x / y de ma fenêtre et zooming-t-elle augmenter / diminuer ma fenêtre d'un certain montant? Qu'en est-il pour la rotation?

Pour la rotation, dois-je faire pour chaque affines transforme polyligne qui représente ma carte du campus? Est-ce ce pas cher à faire à la volée sur une carte de bonne taille?

Ou, est la fenêtre gauche du même et de panoramique / zoom / rotation se fait dans certains otherway?


Par exemple, si vous allez à cette vous le verrez décrire panoramique et de zoom exactement ce que j'ai ci-dessus, en modifiant la fenêtre.

Est-ce exact?

Était-ce utile?

La solution

Ils sont obtenus en appliquant une série de glTranslate, les commandes glRotate (qui représentent la position de la caméra et de l'orientation) avant de dessiner la scène. (Techniquement, vous tourner toute la scène!)

Il y a des fonctions utilitaires comme gluLookAt qui sorta abstraite quelques détails à ce sujet.

Pour simplyify choses, supposons que vous avez deux vecteurs représentant votre appareil photo: la position et la direction.

gluLookAt prend la position, la destination et en vecteur.

Si vous implémentez une classe de vecteur, destinaion = position + direction devrait vous donner un point de destination.

pour rendre les choses simples, vous pouvez supposer le vecteur up d'être toujours (0,1,0)

Alors, avant de rendre quoi que ce soit dans la scène, chargez la matrice d'identité et appeler gluLookAt

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );

Puis commencer à dessiner vos objets

Vous pouvez laisser la durée de l'utilisateur en changeant la position légèrement à droite ou à gauche. La rotation est un peu plus compliqué que vous devez tourner le vecteur de direction. Si l'on suppose que ce que vous êtes en rotation est l'appareil photo, pas un objet dans la scène.

Un problème est, si vous avez seulement un vecteur de direction « avant » comment voulez-vous déplacer? où est le droit et gauche?

Mon approche dans ce cas est de prendre simplement le produit croisé de « direction » et (0,1,0).

Maintenant, vous pouvez déplacer la caméra à gauche et à droite en utilisant quelque chose comme:

position = position + right * amount; //amount < 0 moves to the left

Vous pouvez aller de l'avant en utilisant le « vecteur de direction », mais l'OMI, il est préférable de limiter le mouvement à un plan horizontal, donc obtenir le vecteur avant de la même façon que nous avons obtenu le vecteur droit:

forward = cross( up, right )

Pour être honnête, cela est un peu d'une approche hackish.

L'approche appropriée consiste à utiliser une structure plus de données « sophistiquées » pour représenter la « orientation » de la caméra, et pas seulement vers l'avant. Cependant, puisque vous êtes débutant, il est bon de prendre les choses une étape à la fois.

Autres conseils

En général, il y a trois étapes qui sont appliquées chaque fois que vous faites référence à un point quelconque dans l'espace 3D à l'intérieur opengl.

Etant donné un point local

  • Local -> Monde Transformer
  • Monde -> Transformer l'appareil photo
  • Appareil photo -> Écran de transformation (. Habituellement une projection dépend si vous utilisez la perspective ou orthogonale)

Chacun de ces transformations est de prendre votre point 3d, et en multipliant par une matrice.

Lorsque vous faites pivoter la caméra, il est en train de changer le monde en général -> caméra transformée en multipliant la matrice de transformation par votre rotation / pan / zoom transformation affine. Étant donné que tous vos points sont re-rendu chaque image, la nouvelle matrice soit appliquée à vos points, et il donne l'apparence d'une rotation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top