J'essaie d'implémenter un shader GLSL qui aide à comprendre la relativité restreinte Lorentz Transformation.
Prenons deux observateurs inertiels alignés sur l'axe O
et O'
. L'observateur O'
est en mouvement par rapport O
à la vitesse v=(v_x,0,0)
.
Lorsqu'il est décrit en termes de O'
coordonnées, un événement P' = (x',y',z',ct')
a transformé les coordonnées(x,y,z,ct)= L (x',y',z',ct')
où L est une matrice 4x4 appelée transformation de Lorentz qui nous aide à écrire les coordonnées de l'événement P 'en O
coordonnées.
(pour plus de détails, consultez http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
J'ai écrit un premier vertex shader préliminaire qui applique la transformation de Lorentz étant donné la vitesse à chaque sommet, mais je n'arrive pas à faire fonctionner la transformation correctement.
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) );
Ce shader devrait s'appliquer à chaque sommet et effectuer la transformation de Lorentz non linéaire, mais la transformation qu'il effectue est clairement différente de ce que j'attendais (dans ce cas, une contraction de longueur sur l'axe des x).
Quelqu'un a-t-il déjà travaillé sur un shader de relativité spécial pour un jeu vidéo 3D?
O
est en (0,0,0) regardant vers le bas sur l'axe z tandis que l'observateur O'
est en mouvement par rapport O
à la vitesse v_x
et que les objets décrits O'
sont au repos. Je sais que dans ce vertex shader, la transformation n'est appliquée qu'aux sommets, donc la déformation des lignes est perdue, mais je veux juste comprendre et faire fonctionner cela au début. On dirait que le jeu Polynomial a déjà fait des transformations de ce genre, mais le shader que j'ai trouvé n'a rien d'intéressant, car j'obtiens les mêmes résultats! bit.ly/MueQqo