2009-02-25 19 views
6

Uso de OpenGL Estoy intentando dibujar un mapa primitivo de mi campus.¿Cómo funciona el zoom, la panorámica y la rotación?

¿Alguien puede explicarme cómo se implementan las funciones de panoramización, acercamiento y rotación?

Por ejemplo, con la panorámica y el zoom, ¿es simplemente yo el que ajusta mi ventana gráfica? Entonces trazo y dibujo todas mis líneas que componen mi mapa, y luego, cuando el usuario hace clic y lo arrastra, ¿se ajusta mi ventana gráfica?

Para la panoramización, ¿cambia los valores de x/y de mi ventana gráfica y para hacer zoom aumenta o disminuye mi ventana gráfica en cierta cantidad? ¿Qué hay para la rotación?

Para la rotación, ¿tengo que hacer transformaciones afines para cada polilínea que represente el mapa de mi campus? ¿No será costoso hacerlo sobre la marcha en un mapa de tamaño decente?

O, ¿la ventana gráfica queda igual y la panorámica/acercamiento/rotación se realiza de otra manera?


Por ejemplo, si vas a este link verá lo describen panorámica y de zoom exactamente cómo tengo más arriba, mediante la modificación de la ventana gráfica.

¿Esto no es correcto?

Respuesta

7

Se logran aplicando una serie de comandos glTranslate, glRotate (que representan la posición y orientación de la cámara) antes de dibujar la escena. (técnicamente, ¡está rotando toda la escena!)

Existen funciones de utilidad como gluLookAt que sorta resumen algunos detalles sobre esto.

Para simplificar las cosas, suponga que tiene dos vectores que representan su cámara: posición y dirección.

gluLookAt toma la posición, el destino y el vector ascendente.

Si implementa una clase vector, destinaion = position + direction debería darle un punto de destino.

de nuevo para hacer las cosas simples, se puede asumir el vector hacia arriba para estar siempre (0,1,0)

Entonces, antes de representar cualquier cosa en su lugar, cargar la matriz identidad y llaman gluLookAt

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

Luego comience a dibujar sus objetos

Puede dejar que el usuario se extienda al cambiar la posición ligeramente hacia la derecha o hacia la izquierda. La rotación es un poco más complicada ya que tienes que rotar el vector de dirección. Asumiendo que lo que está rotando es la cámara, no algún objeto en la escena.

Un problema es que si solo tiene un vector de dirección "hacia adelante", ¿cómo lo mueve? donde esta la derecha y la izquierda?

Mi enfoque en este caso es simplemente tomar el producto cruzado de "dirección" y (0,1,0).

Ahora puede mover la cámara hacia la izquierda y hacia la derecha con algo como:

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

se puede avanzar a través del "vector de dirección", pero En mi opinión es mejor para restringir el movimiento a un plano horizontal , a fin de obtener el vector hacia delante de la misma manera que tenemos el vector derecha:

forward = cross(up, right) 

Para ser honesto, esto es algo así como un enfoque hacker.

El enfoque correcto es utilizar una estructura de datos más "sofisticada" para representar la "orientación" de la cámara, no solo la dirección de avance. Sin embargo, como recién estás comenzando, es bueno ir paso a paso.

+2

Permítanme agregar que en ningún momento la "ventana gráfica" (tal como se establece a través de glViewport) entra en este proceso. La ventana gráfica determina en qué región de la ventana va a renderizar (esto no es cierto en realidad, pero piense de esta manera por el momento) y generalmente abarcará toda la ventana. – Thomas

1

Generalmente hay tres pasos que se aplican cada vez que hace referencia a cualquier punto en el espacio 3D dentro de OpenGL.

dado un punto local

  • local -> Mundial Transformar
  • Mundo -> Transformar la cámara
  • cámara -.> Pantalla Transform (por lo general una proyección depende de si está utilizando perspectiva u ortogonal)

Cada una de estas transformaciones toma su punto 3d y se multiplica por una matriz.

Cuando está girando la cámara, generalmente está cambiando la transformación mundo -> cámara al multiplicar la matriz de transformación por la transformación afín de rotación/panorámica/zoom. Como todos sus puntos se vuelven a renderizar en cada cuadro, la nueva matriz se aplica a sus puntos y le da la apariencia de una rotación.

4

Todas estas "acciones" se pueden lograr utilizando las funciones de transformación de matriz de vista de modelo. Debería leer acerca de glTranslatef (panorámica), glScalef (zoom), glRotatef (rotación). También debería tener que leer algunos tutoriales básicos sobre OpenGL, puede encontrar útil this link.

Cuestiones relacionadas