GLSL의 특수 상대성 쉐이더


11

특수 상대성 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 비디오 게임을위한 특수 상대성 쉐이더를 작업 했습니까?


실제로 Wiki가 상태를 연결 한 것처럼 비선형이 아닌 선형 변환입니다. 그러나 당신이 보는 것은 괜찮아 보이지만 확실히 말하기는 어렵습니다.
Maik Semder

당신은 효과를 볼 수 ShaderMaker에서이 쉐이더를 시도,하지만 내가 달성하고자하는 것은이 효과가 있습니다 : spacetimetravel.org/relaflug/relaflug.html 여기에 우리가 x 축에 아이폰에 수축을 볼 수 있지만 잘못된 스케일링을 참조
linello

실제로 카메라를 움직입니까? spacetimetravle 링크는 힘의 가치가 봐 가지고, 소스 코드와 함께 제공
Maik Semder에게

또한 속도 0.5 c / s는 약간 작습니다. 0.9보다 큰 것을 사용해보십시오. 예제는 0.93 c / s를 사용하고 그 속도로 카메라를 움직입니다.
Maik Semder

아니요 관찰자 O가 관찰하는 동안 관찰자 가 (0,0,0) z 축을 내려다보고 있다고 가정합니다.O'O 속도 v_x와 함께 동작 하고 설명 된 물체 가 정지 된 가O' . 이 정점 셰이더에서는 변환이 정점에만 적용되므로 선의 변형이 손실되지만 처음에는 이해하고 작업하고 싶습니다. 게임 다항식이 이미 이런 종류의 변형을 한 것으로 보이지만, 내가 찾은 셰이더는 흥미로운 결과가 없습니다. bit.ly/MueQqo
linello

답변:


4

Lorentz 수축을 구현하려면 가장 좋은 방법은 모션 방향에 따라 객체를 1 / 감마로 명시 적으로 스케일하는 것입니다.

문제는 Lorentz 변환이 공간뿐만 아니라 시간 방향으로 정점을 변위한다는 것입니다. 따라서 특정 시점에서 움직이는 물체가 어떻게 보이는지 알 수는 없습니다. 이를 위해서는 먼저 전체 다이어그램을 변환 한 다음이 다이어그램과 같이 공간 축에 평행하게 "슬라이스"를 가져와야합니다.

Lorentz 수축 시공간 다이어그램

실제를 위해 이것을 계산하려면, 관측자의 참조 프레임에서 현재 시점의 3D 초평면과 정점의 월드 라인을 교차시켜 4D로 효과적으로 광선 추적해야합니다. 이 작업의 결과는 단순히 1 / 감마로 스케일링하는 것과 동일하다고 생각합니다.

(추가 크레딧을 얻으려면 관찰자가 실제로 한 순간에 전체 물체를 볼 수는 없다는 점을 고려하십시오. 광선을 사용하여 물체를 볼 수 있으므로 세계의 선을 교차해야합니다 관찰자의 과거 빛 콘 정점이 실제로 상당히 결과를 변경합니다. 목적은 당신이 단축 모양에서 멀리 이동하지만, 당신이 늘어나 보입니다 것으로 물체가 이동 sidways 이동 객체가 될 것입니다 회전 - 볼 펜로즈 - 테럴 회전을 이상.)


좋아,하지만 시뮬레이션 내에서 시간을 변경하면 어떻게 되나요? 셰이더 외부에서 시간을 균일 한 부동으로 처리하면 시간에 따라 오브젝트가 올바르게 변형되어야합니까?
linello

시간이 각 프레임에 대해 일정하다면 4D 세계의 3D 타임 슬라이스를 사용하는 것이므로 그렇습니다.
Nathan Reed

Lorentz 변환과 별도로 상대 론적 수차를 구현해야하는지 이해하지 못합니다.
linello

@linello 수차에 관심이 있다면 마지막 단락에서 설명한 이보다 정교한 버전이 필요합니다. 즉, 정점의 월드 라인을 관찰자의 과거 라이트 콘과 교차시키고 정점을 교차점으로 이동시킵니다. 공간적 위치. 그것은 버텍스 쉐이더에서 가능해야한다고 생각합니다. Lorentz 변환은 꼭짓점의 월드 라인 설정에만 관여합니다. 또한 객체가 가속, 회전 등이면 월드 라인이 곡선입니다.
Nathan Reed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.