Spezieller Relativitäts-Shader in GLSL

11

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 Ound O'. Der Beobachter O'ist in Bewegung Omit 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 OKoordinaten 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?

Linello
quelle
Es ist eigentlich eine lineare Transformation, nicht nicht linear, wie das von Ihnen verknüpfte Wiki besagt. Was Sie sehen, klingt also in Ordnung, ist jedoch schwer zu sagen, ohne es zu sehen.
Maik Semder
Sie können diesen Shader in ShaderMaker ausprobieren, um die Effekte zu sehen, aber ich möchte diesen Effekt erzielen: spacetimetravel.org/relaflug/relaflug.html Hier sollten wir die Längenkontraktion auf der x-Achse sehen, aber ich sehe eine falsche Skalierung
Linello
Bewegen Sie die Kamera tatsächlich? Der Spacetimetravle-Link kommt mit Quellcode, könnte einen Blick wert sein
Maik Semder
Auch die Geschwindigkeit von 0,5 c / s ist etwas gering. Versuchen Sie, etwas Größeres als 0,9 zu verwenden. Das Beispiel verwendet 0,93 c / s und bewegen Sie die Kamera mit dieser Geschwindigkeit
Maik Semder
Nein, ich nehme an, der Beobachter Oist 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/MueQqoOv_xO'
Linello

Antworten:

4

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:

Lorentz-Kontraktions-Raum-Zeit-Diagramm

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.)

Nathan Reed
quelle
Ok, aber was ist, wenn ich die Zeit innerhalb der Simulation ändere? Ich behandle die Zeit als einen gleichmäßigen Schwimmer, der von außerhalb des Shaders passiert werden soll. Sollte dies das Objekt rechtzeitig richtig verformen?
Linello
Wenn die Zeit für jeden Frame eine Konstante ist, nehmen Sie eine 3D-Zeitscheibe der 4D-Welt. Ja, was ich oben gesagt habe, gilt.
Nathan Reed
Ich verstehe auch nicht, ob ich relativistische Aberration getrennt von der Lorentz-Transformation implementieren muss.
Linello
@linello Wenn Sie sich für Aberration interessieren, klingt es so, als ob Sie die komplexere Version davon benötigen, die ich im letzten Absatz beschrieben habe - das heißt, schneiden Sie die Weltlinie des Scheitelpunkts mit dem vergangenen Lichtkegel des Beobachters und verschieben Sie den Scheitelpunkt zum Schnittpunkt räumliche Lage. Das sollte im Vertex-Shader machbar sein, denke ich. Die Lorentz-Transformation wäre nur an der Einrichtung der Weltlinie des Scheitelpunkts beteiligt. Beachten Sie auch, dass die Weltlinie gekrümmt ist, wenn sich das Objekt beschleunigt, dreht usw.
Nathan Reed