2010-05-06 15 views

Respuesta

7

Es probable que en realidad no quieren que la guiñada, cabeceo y balanceo. Solo necesitas la transformación correcta. Intenta usar gluLookAt para compilarlo. Documentation.

+0

Gracias por la pista. Acabo de empezar a usar OpenGL y no sabía acerca de esta función. Lo solucioné usando esto. – Jack

+0

Esta es una buena respuesta, pero solo es práctica para un subconjunto de las plataformas comunes que proporcionan GLU (p. Ej., No necesariamente plataformas OpenGL ES) – jheriko

14

No se puede obtener de guiñada, cabeceo y balanceo de un vector de dirección que el vector de dirección única le dirá qué dirección mirar en (guiñada y cabeceo)

Para obtener la guiñada y cabeceo utiliza la trigonometría - Asumo que tener algunos conocimientos prácticos. Consulte this wiki page para obtener algunos diagramas útiles para visualizar los ángulos.

Dejando Y = yaw, P = pitch.

En primer lugar para obtener de guiñada que desee:

tan(Y) = x/(-y) 

Ahora para conseguir terreno de juego:

tan(P) = sqrt(x^2 + y^2)/z 

Para obtener los valores reales de Y y P tendrá que utilizar inversa bronceado, I' lo escribí arriba usando bronceado para hacer la derivación más clara.

Tenga en cuenta que los signos menos dependen de cómo defina sus ángulos y ejes, pero debe tener la idea.

A continuación, puede establecer que el rollo sea 0 o lo que desee.

+1

Pero en la práctica suele haber una dirección de "subida" en cualquier aplicación y casi siempre se puede elegir orientación que se mantiene 'hacia arriba' lo más cerca posible hacia arriba. – sigfpe

+0

Muchas gracias por la respuesta. Sí, tienes razón, el rollo no puede determinarse solo por un vector. Necesito un vector ascendente (como sugiere el usuario207442) o un escalar que determina el ángulo. Resolví mi problema al usar gluLookAt pero todavía tengo curiosidad sobre cómo obtener estos ángulos. – Jack

+0

Su expresión para tan (Y) es más o menos intuitiva. Para bronceado (P) no tanto. ¿Podría explicar por qué esta expresión da tan (P) o un enlace a una fuente que lo explique? – dinosaur

2

las ecuaciones de pheelicks son incorrectas. Queridos futuros usuarios de Google, aquí tienen lo que funciona:

Asumiendo inclinación: rotación por eje X, orientación: rotación por eje Y, balanceo: rotación por eje Z. Vector de dirección V (x, y, z)

pitch = asin(V.y/length(V)); 
yaw = asin(V.x/(cos(pitch)*length(V))); //Beware cos(pitch)==0, catch this exception! 
roll = 0; 
+0

Me parece que es más o menos lo mismo, tal vez deberías revisar tu trigonometría. – meneldal

6

Ninguna de estas ecuaciones son 'equivocado' pero todos son un poco torpe. Ryder052, su ejemplo no cuenta ciertos casos como ha comentado. ¿Por qué no usar atan2?

unidad dada (normalizado) vector de dirección d

pitch = asin(-d.Y); 
yaw = atan2(d.X, d.Z) 
Cuestiones relacionadas