Estoy tratando de implementar un sombreador GLSL que ayuda a entender la relatividad especial de la transformación de Lorentz.
Tomemos dos observadores inerciales alineados con ejes O
y O'
. El observador O'
está en movimiento wrt observador O
con velocidad v=(v_x,0,0)
.
Cuando se describe en términos de O'
coordenadas, un evento P' = (x',y',z',ct')
ha transformado las coordenadas.(x,y,z,ct)= L (x',y',z',ct')
donde L es una matriz 4x4 llamada transformación de Lorentz que nos ayuda a escribir las coordenadas del evento P 'en O
coordenadas.
(para más detalles, consulte http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
He escrito un primer sombreador de vértices preliminar que aplica la transformación de Lorentz dada la velocidad a cada vértice, pero no puedo hacer que la transformación funcione correctamente.
vec3 beta= vec3(0.5,0.0,0.0);
float b2 = (beta.x*beta.x + beta.y*beta.y + beta.z*beta.z )+1E-12;
float g=1.0/(sqrt(abs(1.0-b2))+1E-12); // Lorentz factor (boost)
float q=(g-1.0)/b2;
//http://en.wikipedia.org/wiki/Lorentz_transformation#Matrix_forms
vec3 tmpVertex = (gl_ModelViewMatrix*gl_Vertex).xyz;
float w = gl_Vertex.w;
mat4 lorentzTransformation =
mat4(
1.0+beta.x*beta.x*q , beta.x*beta.y*q , beta.x*beta.z*q , beta.x*g ,
beta.y*beta.x*q , 1.0+beta.y*beta.y*q , beta.y*beta.z*q , beta.y*g ,
beta.z*beta.x*q , beta.z*beta.y*q , 1.0+beta.z*beta.z*q , beta.z*g ,
beta.x*g , beta.y*g , beta.z*g , g
);
vec4 vertex2 = (lorentzTransformation)*vec4(tmpVertex,1.0);
gl_Position = gl_ProjectionMatrix*(vec4(vertex2.xyz,1.0) );
Este sombreador debe aplicarse a cada vértice y realizar la transformación no lineal de Lorentz, pero la transformación que realiza es claramente diferente de lo que esperaría (en este caso, una contracción de longitud en el eje x).
¿Alguien ya ha trabajado en el sombreador de relatividad especial para videojuegos 3D?
O
está en (0,0,0) mirando hacia abajo el eje z mientras el observador O'
está en movimiento O
con velocidad v_x
y los objetos descritos O'
están en reposo. Sé que en este sombreador de vértices, la transformación se aplica solo a los vértices, por lo que se pierde la deformación de las líneas, pero solo quiero entender y hacer que esto funcione al principio. Parece que el juego Polynomial ya hizo transformaciones de este tipo, pero el sombreador que he encontrado no tiene nada de interesante, ¡porque obtengo los mismos resultados! bit.ly/MueQqo