특수 상대성 Lorentz Transformation을 이해하는 데 도움이되는 GLSL 쉐이더를 구현하려고합니다.
의 두 축 정렬 관성 관찰자 보자 O
하고 O'
. 관찰자O'
는 O
속도와 함께 동작 wrt 관찰자 입니다 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-direction 참조 )
모든 정점에 속도가 주어지면 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
가 관찰하는 동안 관찰자 가 (0,0,0) z 축을 내려다보고 있다고 가정합니다.O'
O
속도 v_x
와 함께 동작 하고 설명 된 물체 가 정지 된 가O'
. 이 정점 셰이더에서는 변환이 정점에만 적용되므로 선의 변형이 손실되지만 처음에는 이해하고 작업하고 싶습니다. 게임 다항식이 이미 이런 종류의 변형을 한 것으로 보이지만, 내가 찾은 셰이더는 흥미로운 결과가 없습니다. bit.ly/MueQqo