特別な相対性理論のローレンツ変換を理解するのに役立つ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ビデオゲームの特別な相対性シェーダーに取り組んでいますか?
O
が(0,0,0)でz軸を見下ろしているときに、観測者O'
がO
速度とともに動きv_x
、説明されてO'
いるオブジェクトが静止していると仮定します。この頂点シェーダーでは、変換が頂点にのみ適用されるため、線の変形が失われることを知っていますが、最初にこれを理解して機能させたいだけです。ゲーム多項式はすでにこの種の変換を行っているようですが、同じ結果が得られるため、私が見つけたシェーダーは興味深いものではありません!bit.ly/MueQqo