Я намагаюся реалізувати шейдер GLSL, який допомагає зрозуміти особливу відносність трансформації Лоренца.
Візьмемо два інерційних спостерігача, вирівняних по осі O
і O'
. Спостерігач O'
знаходиться в русі WR спостерігача O
зі швидкістю v=(v_x,0,0)
.
Коли описується в термінах O'
координат, подія P' = (x',y',z',ct')
перетворила координати(x,y,z,ct)= L (x',y',z',ct')
де L - матриця 4x4 під назвою перетворення Лоренца, яка допомагає нам записувати координати події P 'в O
координати.
(детальніше дивіться http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )
Я записав перший попередній шейдер вершин, який застосовує перетворення Лоренца з урахуванням швидкості до кожної вершини, але я не можу змусити перетворення працювати правильно.
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) );
Цей шейдер повинен застосовуватися до кожної вершини та виконувати нелінійне перетворення Лоренца, але перетворення, яке він виконує, явно відрізняється від того, що я очікував (у цьому випадку - скорочення довжини на осі x).
Хтось уже працював над спеціальним шейдером відносності для 3D відеоігри?
O
перебуває в (0,0,0) огляді вниз по осі z, тоді як спостерігач O'
перебуває в режимі wrt O
зі швидкістю, v_x
а описані об'єкти O'
знаходяться в спокої. Я знаю, що в цій вершинній шейдері трансформація застосовується тільки для вершин, тому деформація ліній втрачається, але я просто хочу зрозуміти і змусити це спершу працювати. Здається, що гра Polynomial вже зробила подібні трансформації, але шейдер, який я знайшов, нічого не цікавого, тому що я отримую однакові результати! bit.ly/MueQqo