Tôi đang cố gắng thực hiện trình tạo bóng GLSL giúp hiểu được thuyết tương đối đặc biệt Lorentz Transform.
Chúng ta hãy có hai người quan sát quán tính thẳng hàng trục O
và O'
. Người quan sát O'
đang ở trong người quan sát chuyển động wrt O
với vận tốc v=(v_x,0,0)
.
Khi được mô tả dưới dạng O'
tọa độ, một sự kiện P' = (x',y',z',ct')
đã chuyển đổi tọa độ(x,y,z,ct)= L (x',y',z',ct')
Trong đó L là ma trận 4 x 4 gọi là phép biến đổi Lorentz giúp chúng ta viết tọa độ của sự kiện P 'theo O
tọa độ.
(để biết chi tiết, hãy xem http://en.wikipedia.org/wiki/Lorentz_transatures#Boost_in_the_x-direction )
Tôi đã viết ra một shader đỉnh sơ bộ đầu tiên áp dụng phép biến đổi Lorentz với vận tốc cho mọi đỉnh, nhưng tôi không thể làm cho phép biến đổi hoạt động chính xác.
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) );
Trình tạo bóng này nên áp dụng cho mọi đỉnh và thực hiện phép biến đổi Lorentz phi tuyến tính, nhưng phép biến đổi mà nó thực hiện rõ ràng khác với những gì tôi mong đợi (trong trường hợp này là sự co lại theo chiều dài trên trục x).
Có ai đó đã làm việc trên shader tương đối đặc biệt cho trò chơi điện tử 3D chưa?
O
đang ở (0,0,0) nhìn xuống trục z trong khi người quan sát O'
đang ở trạng thái chuyển động O
với vận tốc v_x
và các vật thể được mô tả O'
nằm yên. Tôi biết rằng trong shader đỉnh này, phép biến đổi chỉ được áp dụng cho các đỉnh nên sự biến dạng của các đường bị mất nhưng tôi chỉ muốn hiểu và thực hiện công việc này lúc đầu. Có vẻ như trò chơi Polynomial đã thực hiện các biến đổi loại này, nhưng trình tạo bóng mà tôi tìm thấy không có gì thú vị, bởi vì tôi nhận được kết quả tương tự! bit.ly/MueQqo