GLSLの特別な相対性シェーダー


11

特別な相対性理論のローレンツ変換を理解するのに役立つGLSLシェーダーを実装しようとしています。

2つの軸に整列した慣性オブザーバーOとを考えてみましょう O'。オブザーバーO'は、O速度を伴ったオブザーバーに対して動いていv=(v_x,0,0)ます。

O'座標で説明すると、イベントP' = (x',y',z',ct')は座標を変換します(x,y,z,ct)= L (x',y',z',ct')

ここで、Lはローレンツ変換と呼ばれる4x4行列であり、イベントP 'の座標を座標で書き込むのに役立ちますO

(詳細はhttp://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-directionをご覧ください

すべての頂点に速度を指定してローレンツ変換を適用する最初の予備的な頂点シェーダーを書き留めましたが、変換を正しく機能させることができません。

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

このシェーダーはすべての頂点に適用し、非線形ローレンツ変換を実行する必要がありますが、実行する変換は、私が期待するものとは明らかに異なります(この場合、x軸の長さ収縮)。

誰かがすでに3Dビデオゲームの特別な相対性シェーダーに取り組んでいますか?


あなたがリンクしたウィキのように、それは実際には非線形ではなく線形変換です。ですから、見たものは問題ないように見えますが、見なければわかりません。
Maik Semder 2012

あなたは効果を見るためにShaderMakerでこのシェーダを試してみてください、しかし、私が達成したいと思い、この効果であることができます。spacetimetravel.org/relaflug/relaflug.htmlここでは、x軸上な長さの収縮が表示されるはずですが、私は間違ったスケーリングを見ます
リネロ2012

実際にカメラを動かしていますか?spacetimetravle-linkにはソースコードが付属しているので、一見の価値があるかもしれません
Maik Semder 2012

また、速度0.5 c / sは少し小さい
です。0.9

いいえ観測者Oが(0,0,0)でz軸を見下ろしているときに、観測者O'O速度とともに動きv_x、説明されてO'いるオブジェクトが静止していると仮定します。この頂点シェーダーでは、変換が頂点にのみ適用されるため、線の変形が失われることを知っていますが、最初にこれを理解して機能させたいだけです。ゲーム多項式はすでにこの種の変換を行っているようですが、同じ結果が得られるため、私が見つけたシェーダーは興味深いものではありません!bit.ly/MueQqo
linello 2012

回答:


4

ローレンツ収縮を実装するには、おそらく、オブジェクトをモーションの方向に沿って1 / gammaだけ明示的にスケーリングすることをお勧めします。

問題は、ローレンツ変換が頂点を時間方向と空間内で変位させるため、それ自体では、特定の瞬間に移動するオブジェクトがどのように見えるかを提供しないことです。これを行うには、最初にオブジェクト全体を変換してから、次の図のように、空間の軸に平行にオブジェクトを「スライス」する必要があります。

ローレンツ収縮時空図

これを実際に計算するには、効果的に4Dでレイトレーシングし、頂点の世界線と観測者の参照フレームの現在の瞬間の3D超平面を交差させる必要があります。これを実行した結果は、単に1 / gammaでスケーリングした場合と同じだと思います。

(追加のクレジットとして、オブザーバーが一度にオブジェクト全体を実際に見ることはないという事実を考慮に入れてください。彼らは光線を使用してそれを見るでしょう。そのため、あなたは観察者の過去のライトコーンを含む頂点。これは実際に結果を大きく変化させます。あなたから離れて移動するオブジェクトは短く見えますが、手前に移動するオブジェクトは細長く見え、シドウェイを移動するオブジェクトが回転します - ペンローズ-テレル回転を参照多くのための。)


わかりましたが、シミュレーション内の時間を変更するとどうなりますか?時間をシェーダーの外側から渡される均一なフロートとして扱います。これにより、オブジェクトが時間内に正しく変形しますか?
リネロ2012

時間が各フレームの定数である場合、4Dの世界の3Dタイムスライスを使用しているので、はい、上で述べたことが成立します。
ネイサンリード

また、ローレンツ変換とは別に相対論的収差を実装する必要があるかどうかもわかりません。
リネロ2012

@linello収差を気にする場合は、前の段落で説明したより洗練されたバージョンが必要なようです。つまり、頂点のワールドラインと観測者の過去のライトコーンを交差させ、頂点を交点のポイントに移動します。空間位置。これは頂点シェーダーで実行できるはずです。ローレンツ変換は、頂点のワールドラインの設定にのみ関与します。また、オブジェクトが加速している、回転しているなどの場合、ワールドラインは湾曲しています。
Nathan Reed
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.