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?
fuente
O
está en (0,0,0) mirando hacia abajo el eje z mientras el observadorO'
está en movimientoO
con velocidadv_x
y los objetos descritosO'
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/MueQqoRespuestas:
Para implementar la contracción de Lorentz, su mejor opción es probablemente escalar explícitamente el objeto en 1 / gamma a lo largo de la dirección del movimiento.
El problema es que la transformación de Lorentz desplaza los vértices en la dirección del tiempo, así como en el espacio, por lo que por sí solo no le dará la apariencia de un objeto en movimiento en un momento específico del tiempo. Para hacer eso, primero tendría que transformar todo el objeto y luego tomar un "corte" paralelo a los ejes espaciales, como en este diagrama:
Para calcular esto de verdad, efectivamente tendría que trazar un trazado de rayos en 4D, intersectando la línea mundial del vértice con el hiperplano 3D del momento actual en el marco de referencia del observador. Creo que el resultado de hacer esto es lo mismo que simplemente escalar en 1 / gamma.
(Para obtener un crédito adicional, tenga en cuenta el hecho de que un observador en realidad no vería todo el objeto en un solo momento: lo verían usando rayos de luz. Por lo tanto, necesitaría cruzar la línea mundial del vértice con el cono de luz pasado del observador. Esto en realidad cambia los resultados significativamente: un objeto que se aleja de usted se verá acortado, pero un objeto que se mueva hacia usted aparecerá alargado y un objeto que se mueve hacia los lados girará - vea rotación de Penrose-Terrell para más.)
fuente