Estou tentando implementar um shader GLSL que ajuda a entender a relatividade especial Lorentz Transformation.
Vamos pegar dois observadores inerciais alinhados ao eixo O
e O'
. O observador O'
está em movimento, observador O
com velocidade v=(v_x,0,0)
.
Quando descrito em termos de O'
coordenadas, um evento P' = (x',y',z',ct')
transformou coordenadas(x,y,z,ct)= L (x',y',z',ct')
onde L é uma matriz 4x4 chamada transformação de Lorentz, que nos ajuda a escrever as coordenadas do evento P 'em O
coordenadas.
(para obter detalhes, consulte http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
Eu escrevi um primeiro shader de vértice preliminar que aplica a transformação de Lorentz, dada a velocidade de cada vértice, mas não consigo fazer com que a transformação funcione corretamente.
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) );
Esse sombreador deve ser aplicado a todos os vértices e executar a transformação não linear de Lorentz, mas a transformação que ele realiza é claramente diferente do que eu esperaria (neste caso, uma contração de comprimento no eixo x).
Alguém já trabalhou no shader de relatividade especial para videogame 3D?
O
esteja (0,0,0) olhando para o eixo z enquanto o observador O'
estiver em movimento, O
com velocidade, v_x
e os objetos descritos O'
estão em repouso. Eu sei que neste shader de vértice a transformação é aplicada apenas para vértices, para que a deformação de linhas seja perdida, mas eu só quero entender e fazer isso funcionar primeiro. Parece que o jogo Polynomial já fez transformações desse tipo, mas o shader que encontrei não é nada interessante, porque eu recebo os mesmos resultados! bit.ly/MueQqo