我正在尝试实现一个GLSL着色器,该着色器有助于理解相对论的洛伦兹变换。
让我们拿两个与轴对齐的惯性观测器 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是一个称为Lorentz变换的4x4矩阵,它可以帮助我们将事件P'的O
坐标写入坐标中。
(有关详细信息,请参见http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x方向)
我已经写下了第一个初步的顶点着色器,该着色器在给定每个顶点速度的情况下应用了Lorentz变换,但是我无法使变换正常工作。
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) );
该着色器应应用于每个顶点并执行非线性Lorentz变换,但是它执行的变换明显不同于我期望的变换(在这种情况下,这是X轴的长度收缩)。
有人已经为3D电子游戏开发了相对论着色器吗?
O
在以速度O'
运动时,观察者处于(0,0,0)向下沿z轴的方向,并且所描述的对象处于静止状态。我知道在此顶点着色器中,变换仅应用于顶点,因此线的变形丢失了,但是我只想首先理解并进行工作。似乎游戏“多项式”已经进行了这种转换,但是我发现的着色器一点也不有趣,因为我得到了相同的结果!bit.ly/MueQqoO
v_x
O'