2011-12-22 13 views
7

Sé que hay muchas preguntas sobre la rotación en 3D que se han respondido aquí, pero todas parecen tratar con matrices rotacionales y cuaterniones en OpenGL (y realmente no me importa si obtengo bloqueo de cardán) Necesito obtener coordenadas 3d EX: (x, y, z) de un punto que siempre debe ser la misma distancia, lo llamaré "d" por ahora, desde el origen. La única información que tengo como entrada es la deltax y deltay del mouse en la pantalla. Hasta el momento esto es lo que he intentado:rotación en 3D alrededor del origen

Primero:

thetaxz+=(omousex-mouseX)/(width); 
thetaxy+=(omousey-mouseY)/(height); 

(thetaxy es el ángulo en radianes en el eje X, Y y thetaxz en la x, eje z) (limito ambos ángulos de modo que si son menos que o igual a 0 que son iguales a 2 * pi)

Segundo:

pointX=cos(thetaxz)*d; 
pointY=sin(thetaxy)*d; 

(pointx es x del punto de coordenadas y puntiagudo es la y)

Tercero:

if(thetaxz)<PI){ 
pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d)); 
}else{ 
    pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d))); 
} 

(cuadrados() es una función que plazas y abs() es una función de valor absoluto) (Pointz debe ser z del punto de coordenadas y es, excepto en el cruce entre la z positiva hemisferio y hemisferio z negativo. A medida que se acerca al borde, el punto se estira más allá de la distancia en la que siempre se supone que está en xey, aparentemente de forma aleatoria alrededor de 0.1-0.2 radianes de thetaxz la coordenada z se convierte en NAN o indefinida)

Tengo pensé en esto por un tiempo, y la verdad es que estoy teniendo dificultades para entender el concepto de cuaterniones y matrices rotacionales; sin embargo, si me puedes mostrar cómo usarlos para generar coordenadas reales, me encantaría aprender. Todavía preferiría si pudiera usar algo de trigonometría en algunos ejes. Gracias de antemano por cualquier ayuda y si necesita más información, solo pregunte.

Sugerencia/idea de último minuto: Creo que puede tener algo que ver con la posición z que afecta las posiciones x e y, pero no estoy seguro.

EDIT: dibujó un diagrama: enter image description here

+0

No estoy 100%, esto es exactamente lo que quiere, pero creo que es posible que desee ver en [gluUnProject] (http://nehe.gamedev.net/article/using_gluunproject/16013 /) para convertir coordenadas 2D en 3D basadas en matrices de cámara. Haga esto para un punto en los planos de cámara cercanos y lejanos, y luego use algunos trigonométricos para encontrar el punto a lo largo de la línea resultante que es la distancia deseada desde el origen. Tenga en cuenta que hay 0, 1 o 2 soluciones para este problema, dependiendo de la línea – Hybrid

+3

¿Puede decirnos el problema original un poco más claro, quizás con una imagen? –

+0

Agregué un enlace de imagen porque solo tengo 1 representante porque soy nuevo en este sitio. –

Respuesta

5

Si realmente desea ningún éxito en esto, usted va a tener que morder la bala y aprender sobre rotation matrices y/o quaternion rotations. Puede haber otras formas de hacer lo que quiera, pero las matrices de rotación y las rotaciones de cuaternión se usan simplemente porque son ampliamente entendidas y están entre los medios más simples de expresar y aplicar rotaciones a los vectores. Cualquier otra representación que alguien pueda proponer será probablemente una reformulación más compleja de uno o ambos. De hecho, se puede mostrar que la rotación es linear transformation y, por lo tanto, se puede expresar como matrix. Las rotaciones de Quaternion son solo un medio simplificado de rotación de vectores en 3D, y por lo tanto tienen representaciones de matriz equivalentes.

Dicho esto, parece que le interesa agarrar un objeto en su escena con un clic del mouse y rotarlo de forma natural. Si ese es el caso, debería consultar el método ArcBall (hay numerous examples que quizás quiera revisar). Esto todavía requiere que sepas algo de cuaterniones. También encontrará que será útil una comprensión mínima de los aspectos básicos de linear algebra.

actualización: Basado en el diagrama y los comentarios que contiene, parece que todo lo que está realmente tratando de hacer es convertir a Spherical CoordinatesCartesian Coordinates. Mientras estemos de acuerdo con la notación, es fácil. Deje que θ sea el ángulo que está llamando XY, es decir, el ángulo entre el eje X girado alrededor del eje Z; esto se llama ángulo acimutal y estará en el rango [0, 2 π) radianes o [0 °, 360 °). Deje φ ser un ángulo entre el plano XY y su vector; esto se llama ángulo de elevación y estará en el rango [- π/2, + π/2] o [-90 °, +90 °] y corresponde al ángulo que está llamando ángulo XZ (rotación en el Plano XZ sobre el eje Y). Hay otras convenciones, así que asegúrese de ser consistente. De todos modos, la conversión es simplemente:

x = d∙cos(φ)∙cos(θ) 
y = d∙cos(φ)∙sin(θ) 
z = d∙sin(φ)
+0

Gracias, pero no estoy usando OpenGL y no estoy realmente agarrando un objeto Estoy rotando la cámara de escenas no transformando el sistema de coordenadas de escenas. ¿Hay alguna manera de obtener coordenadas de una matriz de rotación porque entonces podría usarlas? –

+0

Según su diagrama, creo que solo quiere convertir coordenadas esféricas a coordenadas cartesianas. He editado mi respuesta para mostrarte cómo hacerlo. Si intentas hacer algo interactivo con el mouse y mover tu cámara sobre el origen de esta manera, no creo que vayas a obtener los resultados que estás esperando. Dicho esto, realmente creo que estarías mejor al menos considerando el enfoque de ArcBall. – andand

+0

¡Gracias, me di cuenta justo antes de que publicaras esto, pero gracias de todos modos! Gran ayuda, te doy más uno, pero aún no tengo suficientes representantes. Lo intentaré y volveré más tarde porque fuiste muy útil e informativo. –

Cuestiones relacionadas