Sto cercando di implementare uno shader GLSL che aiuta a capire la relatività speciale Trasformazione di Lorentz.
Prendiamo due osservatori inerziali allineati ad asse O
e O'
. L'osservatore O'
è in movimento O
con velocità v=(v_x,0,0)
.
Se descritto in termini di O'
coordinate, un evento P' = (x',y',z',ct')
ha trasformato le coordinate(x,y,z,ct)= L (x',y',z',ct')
dove L è una matrice 4x4 chiamata trasformazione di Lorentz che ci aiuta a scrivere le coordinate dell'evento P 'in O
coordinate.
(per dettagli guarda http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
Ho scritto un primo shader di vertice preliminare che applica la trasformazione di Lorentz data la velocità a ogni vertice, ma non riesco a far funzionare correttamente la trasformazione.
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) );
Questo shader dovrebbe applicarsi a tutti i vertici ed eseguire la trasformazione non lineare di Lorentz, ma la trasformazione che esegue è chiaramente diversa da quella che mi aspetterei (in questo caso una contrazione della lunghezza sull'asse x).
Qualcuno ha già lavorato su uno shader di relatività speciale per il videogioco 3D?
O
sia (0,0,0) guardando l'asse z mentre l'osservatore O'
è in movimento O
con velocità v_x
e gli oggetti descritti O'
sono a riposo. So che in questo vertex shader la trasformazione viene applicata solo ai vertici, quindi la deformazione delle linee viene persa, ma voglio solo capire e far funzionare questo all'inizio. Sembra che il gioco Polynomial abbia già fatto trasformazioni di questo tipo, ma lo shader che ho trovato non ha nulla di interessante, perché ottengo gli stessi risultati! bit.ly/MueQqo