Ich versuche, einen GLSL-Shader zu implementieren, der das Verständnis der Lorentz-Transformation mit spezieller Relativitätstheorie erleichtert.
Nehmen wir zwei achsenausgerichtete Trägheitsbeobachter O
und O'
. Der Beobachter O'
ist in Bewegung O
mit der Geschwindigkeit des Beobachters v=(v_x,0,0)
.
Bei der Beschreibung in O'
Koordinaten hat ein Ereignis P' = (x',y',z',ct')
Koordinaten transformiert(x,y,z,ct)= L (x',y',z',ct')
Dabei ist L eine 4x4-Matrix namens Lorentz-Transformation, die uns hilft, die Koordinaten des Ereignisses P 'in O
Koordinaten zu schreiben .
(Details finden Sie unter http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
Ich habe einen ersten vorläufigen Vertex-Shader aufgeschrieben, der die Lorentz-Transformation unter Berücksichtigung der Geschwindigkeit auf jeden Vertex anwendet, aber ich kann die Transformation nicht richtig zum Laufen bringen.
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) );
Dieser Shader sollte auf jeden Scheitelpunkt angewendet werden und die nichtlineare Lorentz-Transformation durchführen, aber die Transformation, die er ausführt, unterscheidet sich deutlich von dem, was ich erwarten würde (in diesem Fall eine Längenkontraktion auf der x-Achse).
Hat jemand bereits an einem speziellen Relativitäts-Shader für 3D-Videospiele gearbeitet?
O
ist in (0,0,0) und schaut die z-Achse hinunter, während der Beobachter mit Geschwindigkeit O'
in Bewegung ist und die beschriebenen Objekte in Ruhe sind. Ich weiß, dass in diesem Vertex-Shader die Transformation nur für Vertices angewendet wird, sodass die Verformung von Linien verloren geht, aber ich möchte dies zunächst nur verstehen und zum Funktionieren bringen. Scheint, dass das Spiel Polynomial bereits Transformationen dieser Art durchgeführt hat, aber der Shader, den ich gefunden habe, ist nicht interessant, weil ich die gleichen Ergebnisse erhalte! bit.ly/MueQqoO
v_x
O'