GLSL中的相对论着色器


11

我正在尝试实现一个GLSL着色器,该着色器有助于理解相对论的洛伦兹变换。

让我们拿两个与轴对齐的惯性观测器 OO'。观察者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电子游戏开发了相对论着色器吗?


正如您链接的Wiki所述,它实际上是线性变换,而不是非线性变换。因此,您所看到的听起来不错,但是,如果没有看到它就很难确定。
Maik Semder

您可以在ShaderMaker中尝试使用此着色器来查看效果,但是我想要实现的效果是:spacetimetravel.org/relaflug/relaflug.html在这里,我们应该看到x轴上的长度收缩,但是缩放比例不正确
linello 2012年

您实际上在移动相机吗?spacetimetravle-link随附源代码,可能值得一看
Maik Semder 2012年

同样,速度0.5 c / s有点小,请尝试使用大于0.9的速度,示例使用0.93 c / s并以该速度移动相机
Maik Semder 2012年

不,我想观察者O在以速度O'运动时,观察者处于(0,0,0)向下沿z轴的方向,并且所描述的对象处于静止状态。我知道在此顶点着色器中,变换仅应用于顶点,因此线的变形丢失了,但是我只想首先理解并进行工作。似乎游戏“多项式”已经进行了这种转换,但是我发现的着色器一点也不有趣,因为我得到了相同的结果!bit.ly/MueQqoOv_xO'
linello 2012年

Answers:


4

要实现洛伦兹收缩,最好的选择就是沿运动方向以1 / gamma显式缩放对象。

问题在于洛伦兹变换会在时间方向和空间上移动顶点,因此,就其本身而言,它无法提供特定时间点上移动物体的外观。为此,您必须首先转换整个对象,然后在与空间轴平行的位置对其进行“切片”,如下图所示:

洛伦兹收缩时空图

要实际计算此值,您必须有效地以4D方式进行光线跟踪,使顶点的世界线与观察者参考系中当前时间的3D超平面相交。我相信这样做的结果与简单地按1 / gamma缩放相同。

(要获得额外的信誉,请考虑以下事实:观察者实际上不会在一个时刻立即看到整个物体:他们会使用光线看到它。因此,您需要与物体的世界线相交观察者过去的光锥的顶点,这实际上会显着改变结果:远离您的物体看起来会变短,但是朝向您运动的物体看起来会变长,并且向旁移动的物体会旋转 -请参见Penrose-Terrell旋转了解更多。)


好的,但是如果我要更改模拟中的时间怎么办?我将时间视为从着色器外部传递的均匀浮动,这是否应使对象及时正确变形?
linello 2012年

如果每个帧的时间都是恒定的,那么您正在对4D世界进行3D时间切片,所以是的,我上面所说的成立。
内森·里德

我是否还必须与劳伦兹变换分开实施相对论像差,我也不明白。
linello 2012年

@linello如果您关心像差,听起来您需要我在上一段中描述的更复杂的版本-也就是说,将顶点的世界线与观察者的过去光锥相交,然后将顶点移至相交点空间位置。我认为这应该在顶点着色器中可行。洛伦兹变换仅会涉及建立顶点的世界线。另请注意,如果对象正在加速,旋转等,则世界线是弯曲的。
内森·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.