opengl camera rotation 3d

OpenGL gira una cámara alrededor de un punto



glulookat (4)

¿Por qué molestarse con todos los problemas de girar la cámara y no rotar la escena en sí?
Es mucho más directo. simplemente gire la matriz de la vista de modelo alrededor del origen. Obtendrás exactamente el mismo resultado.

En OpenGL estoy tratando de rotar una cámara alrededor de un punto, con la cámara a una distancia r del punto y mirando hacia el punto cuando gira. En otras palabras, quiero que la cámara se mueva a lo largo de la circunferencia de un círculo a un radio r desde el centro, con la cámara hacia el centro en cualquier punto a lo largo de la circunferencia.

Digamos que en el espacio 3d, el centro del círculo es (3, 0, 3);

He intentado:

// move to center of circle glTranslatef(-3, 0, -3) // move a distance away from the circle glTranslatef(0, 0, r); // rotate along the y "up" axis glRotatef(CameraAngle, 0, 1, 0);

donde CameraAngle son los grados que se mueven alrededor del círculo.

Mi resultado final es que la cámara sigue girando a lo largo del origen, no en el centro del círculo. ¿Alguien puede ayudarme a solucionar este problema? ¡Gracias!


Encuentro problemas como este mucho más fáciles de resolver con gluLookAt (). Usted define un camino para la cámara (¡un círculo es fácil!) Y mantiene el punto "central" fijo (es decir, lo que está mirando).

El único truco posible es definir un vector bueno, pero no suele ser demasiado trabajo. Si la ruta y el punto objetivo están en el mismo plano, ¡puedes usar el mismo vector ascendente cada vez!


Necesitas:

  • gira la cámara alrededor del origen y luego tradúcela (*)

o:

  • use gluLookAt para mantener la cámara apuntando hacia el centro del círculo

(*) las funciones de rotación normalmente giran alrededor del origen. Para girar alrededor de otro punto P tienes que:

  • traducir (-P)
  • girar
  • traducir (P)

es un poco confuso, pero creo que deberías:

// move camera a distance r away from the center glTranslatef(0, 0, -r); // rotate glRotatef(angley, 0, 1, 0); glRotatef(anglex, 1, 0, 0); // move to center of circle glTranslatef(-cx, -cy, -cz)

tenga en cuenta que la orden NO debe ser modificada.