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!

¿Fue útil?

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
Las funciones de rotación

(*) 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!

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