Pregunta

El uso de OpenGL estoy tratando de dibujar un mapa primitivo de mi campus.

Puede alguien explicarme cómo paneo, zoom y rotación se implementa normalmente?

Por ejemplo, la panorámica y de zoom, es que simplemente me ajustar mi vista? Por lo tanto, la trama y dibujar todas mis líneas que componen mi mapa, y luego como el usuario hace clic y arrastra ajusta a mi ventana?

En la panorámica, Cómo cambia los valores X / Y de mi vista y para un acercamiento lo hace aumentar / disminuir mi vista por cierta cantidad? ¿Qué pasa con la rotación de?

Para la rotación, lo que tengo que hacer afín transforma para cada polilínea que representa mi mapa del campus? No será esto caro hacerlo sobre la marcha en un mapa de tamaño decente?

O, es el visor salió de la misma y la panorámica / zoom / rotación se hace en algunos otherway?


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

No es esto correcto?

¿Fue útil?

Solución

Están alcanzados mediante la aplicación de una serie de glTranslate, comandos glRotate (que representan la posición de la cámara y la orientación) antes de dibujar la escena. (Técnicamente, que está girando toda la escena!)

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

Para simplyify cosas, suponga que tiene dos vectores que representan la cámara: la posición y dirección.

gluLookAt toma la posición, destino, y hasta vectorial.

Si implementa una clase de vectores, destinaion = position + direction debe darle un punto de destino.

Una vez más hacer las cosas simples, se puede asumir el vector hacia arriba para estar siempre (0,1,0)

A continuación, antes de representar cualquier cosa en su lugar, cargar la matriz identidad y llamar gluLookAt

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

A continuación, empezar a dibujar los objetos

Puede dejar que el lapso de usuario cambiando la posición ligeramente hacia la derecha o hacia la izquierda. La rotación es un poco más complicado ya que tienes que girar el vector de dirección. Suponiendo que lo que está girando es la cámara, no un objeto en la escena.

Uno de los problemas es, si sólo tiene un vector de dirección "hacia adelante" ¿cómo se mueve? ¿dónde está la derecha y la izquierda?

Mi enfoque en este caso es que acaba de tomar el producto vectorial 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

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 adecuado es utilizar una estructura de "sofisticada" más datos para representar la "orientación" de la cámara, no sólo la dirección de avance. Sin embargo, puesto que usted está empezando a cabo, es bueno tomar las cosas un paso a la vez.

Otros consejos

Todas estas "acciones" se puede lograr usando Modelo-Vista funciones de transformación de matriz. Usted debe leer sobre glTranslatef (panorámica), glScalef (zoom), glRotatef (rotación). También debería tener que leer algunos tutorial básico sobre OpenGL, es posible encontrar este enlace útil.

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

Dado un punto local

  • Local -> Mundial Transform
  • Mundial -> Transformar la cámara
  • Cámara -> Pantalla Transform (. Normalmente una proyección depende de si está utilizando perspectiva u ortogonal)

Cada una de estas transformadas se está llevando a su punto de 3d, y multiplicando por una matriz.

Al girar la cámara, por lo general cambiando el mundo -> cámara transformar multiplicando la matriz transformada por su rotación / giro / zoom transformación afín. Desde todos los puntos están re-renderizados cada marco, la nueva matriz se aplica a sus puntos, y da la apariencia de una rotación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top