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?
quelle
O
ist in (0,0,0) und schaut die z-Achse hinunter, während der Beobachter mit GeschwindigkeitO'
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'
Antworten:
Um die Lorentz-Kontraktion zu implementieren, ist es wahrscheinlich am besten, das Objekt explizit um 1 / Gamma entlang der Bewegungsrichtung zu skalieren.
Das Problem ist, dass die Lorentz-Transformation Scheitelpunkte sowohl in zeitlicher als auch in räumlicher Richtung verschiebt, sodass Sie selbst nicht wissen, wie ein sich bewegendes Objekt zu einem bestimmten Zeitpunkt aussieht. Dazu müssten Sie zuerst das gesamte Objekt transformieren und dann parallel zu den Raumachsen einen "Schnitt" durch das Objekt ziehen, wie in diesem Diagramm dargestellt:
Um dies real zu berechnen, müssten Sie effektiv in 4D Raytrace durchführen und die Weltlinie des Scheitelpunkts mit der 3D-Hyperebene des aktuellen Zeitpunkts im Referenzrahmen des Beobachters schneiden. Ich glaube, das Ergebnis ist das gleiche wie eine einfache Skalierung um 1 / Gamma.
(Berücksichtigen Sie für zusätzliche Gutschriften die Tatsache, dass ein Beobachter nicht das gesamte Objekt zu einem bestimmten Zeitpunkt tatsächlich sehen würde: Er würde es mit Lichtstrahlen sehen. Sie müssten also die Weltlinie des Scheitelpunkt mit dem vergangenen Lichtkegel des Betrachters. Dies ändert die Ergebnisse tatsächlich erheblich: Ein Objekt, das sich von Ihnen wegbewegt, sieht verkürzt aus, aber ein Objekt, das sich auf Sie zubewegt, erscheint länglich und ein Objekt, das sich seitwärts bewegt, wird gedreht - siehe Penrose-Terrell-Drehung für mehr.)
quelle