Cita de: Warchief en 18 de Agosto de 2011, 07:03:12 PM
VRP es la posicion.
VPN es la direccion donde mira.
VUV es el vector "up" de la camara.
A partir de VPN y VUV se puede obtener el vector right/left mediante producto vectorial. Eso te da los 3 ejes de coordenadas de la camara, que junto a la posicion, te da la transformacion de la camara. Lo que tienes que hacer en construir esa matriz de transformacion, que sera de la forma:
M = RT (donde R es rotacion y T traslacion)
Sean n, u y v los ejes de la camara en coordenadas locales. (* es producto vectorial)
n = VPN / |VPN| (es decir, n es el vector front de la camara, que es como dijimos VPN, pero hay que normalizar)
u = n*VUV / |n*VUV| (es decir, u es el vector up de la camara en coordenadas locales y normalizado)
v = u*n (obtenemos vector right/left de la camara, que ya esta normalizado por ser producto de dos normalizados)
Con esos tres ejes ya tienes R = (u, v, n)
Ya solo queda hallar la traslacion, que se calcula transformando el punto VRP a las nuevas coordenadas:
t = -pR (donde p es el punto = VRP, y R es la matriz de rotacion que hemos creado)
M = RT, dado que R es 3x3 y T 3x1, necesitas anyadir W 1x3 = 0,0,0,1 para tener una matriz de transformacion 4x4.
Pon la matriz a la camara y problema resuelto.
Espero que con eso puedas entender mejor ahora las definiciones que leas por ahi.
Si quieres hacer trampas mira el metodo computeMatrix() de aqui:
http://www.cs.ucl.ac.uk/teaching/3079/java-lab1/question/camera.java
IMPORTANTE:
El orden de los vectores y de los productos vectoriales es importante para la orientacion de la camara, asegurate de que el eje de coordenadas (left/right) coincide con la escena que tienes en opengl. En el fichero java aplican signo negativo a n, probablemente por esta razon.
Aun sigo liado con la cámara. Pero me quedo rematarlo.
Ya tengo la cámara casi implementada.
Los pasos que sigo para son los siguientes:
a- Doy por consola VRP,VPN,VUV.
Como la cámara es fija , los translate y rotate se hace sobre el objeto.
b- Translate(-VRPx,-VRPy,VRPz).
c- Roto sobre X poniendo el VPNy=0 , el VPNz cambia en consecuencia.
d- Roto sobre Y ponuendo el VPNx=0, el VPNz cambia en consecuencia.
e- Roto sobre Z para alinear la u sobre el eje X. Necesito calcular u y v.
n = VPN / |VPN| (es decir, n es el vector front de la camara, que es como dijimos VPN, pero hay que normalizar)
u = n*VUV / |n*VUV| (es decir, u es el vector up de la camara en coordenadas locales y normalizado)
v = u*n (obtenemos vector right/left de la camara, que ya esta normalizado por ser producto de dos normalizados)
Con esos tres ejes ya tienes R = (u, v, n)
PROBLEMA. Antes del paso c calculo el n,u,v, pero tras los pasos c y d se me han movido.
De n(VPN) llevo el control, pero de u no se como hacerlo.