Próbuję wdrożyć moduł cieniujący GLSL, który pomaga zrozumieć specjalną teorię względności Lorentza Transformation.
Weźmy dwóch obserwatorów bezwładnościowych O
i O'
. Obserwator O'
porusza się O
z prędkością obserwatora v=(v_x,0,0)
.
W przypadku opisu O'
współrzędnych zdarzenie P' = (x',y',z',ct')
przekształciło współrzędne(x,y,z,ct)= L (x',y',z',ct')
gdzie L jest macierzą 4x4 zwaną transformacją Lorentza, która pomaga nam zapisywać współrzędne zdarzenia P 'we O
współrzędnych.
(po szczegóły patrz http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
Zapisałem pierwszy wstępny moduł cieniujący wierzchołek, który stosuje transformację Lorentza, biorąc pod uwagę prędkość każdego wierzchołka, ale nie mogę uzyskać prawidłowego działania transformacji.
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) );
Ten moduł cieniujący powinien mieć zastosowanie do każdego wierzchołka i wykonywać nieliniową transformację Lorentza, ale transformacja, którą wykonuje, wyraźnie różni się od tego, czego się spodziewałam (w tym przypadku skrócenie długości na osi x).
Czy ktoś już pracował nad specjalnym shaderem względności do gier 3D?
O
patrzy (0,0,0) w dół na oś z, podczas gdy obserwator O'
porusza się O
z prędkością, v_x
a opisane obiekty O'
znajdują się w spoczynku. Wiem, że w tym module cieniującym wierzchołki transformacja jest stosowana tylko dla wierzchołków, więc deformacja linii jest tracona, ale po prostu chcę to zrozumieć i na początek to zrobić. Wydaje się, że gra Polynomial już dokonała tego rodzaju transformacji, ale znaleziony moduł cieniujący nie jest niczym interesującym, ponieważ otrzymuję takie same wyniki! bit.ly/MueQqo