OpenGL girando una cámara alrededor de un punto
Pregunta
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 al punto cuando gira. En otras palabras, quiero que la cámara se mueva a lo largo de la circunferencia de un círculo en un radio r desde el centro, con la cámara mirando 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!
Solución
Necesita:
- gire la cámara alrededor del origen y luego traduzca (*)
o:
- use
gluLookAt
para mantener la cámara apuntando al centro del círculo
(*) normalmente giran alrededor del origen. Para rotar alrededor de otro punto P
debe:
- traducir (-P)
- rotar
- traducir (P)
Otros consejos
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 el orden NO debe cambiarse.
¿Por qué molestarse con todos los problemas de girar la cámara y no girar la escena en sí misma?
Es mucho más sencillo. simplemente gire la matriz modelview alrededor del origen. Obtendrás exactamente el mismo resultado.
Encuentro problemas como este mucho más fáciles de resolver con gluLookAt (). Defina una ruta para la cámara (¡un círculo es fácil!) Y mantenga el "centro". punto fijo (es decir, lo que estás viendo).
El único truco posible es definir un buen vector ascendente, pero no suele ser demasiado trabajo. Si la ruta y el punto objetivo están en el mismo plano, ¡puedes usar el mismo vector hacia arriba cada vez!