OpenGL girando una cámara alrededor de un punto


En OpenGL estoy tratando de rotar una cámara alrededor de un punto, con la cámara siendo la distancia r desde el punto y frente 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 circulo.

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

Author: Bryan Denny, 2008-11-13

4 answers

Necesitas:

  • gire la cámara alrededor del origen y luego tradúzcala (*)

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 tienes que:

  • translate (- P)
  • rotar
  • translate (P)
 24
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 17:54:52

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.

 9
Author: neoedmund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-03 07:18:55

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

 2
Author: shoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 18:49:38

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 mantener el punto" central " fijo (es decir, la cosa que estás mirando).

El único truco posible es definir un buen vector ascendente but pero normalmente no demasiado trabajo. Si la ruta y el punto objetivo están en el mismo plano, puede utilizar el mismo vector ascendente cada vez!

 1
Author: Drew Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 17:53:41