Shader tương đối đặc biệt trong GLSL


11

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 OO'. Người quan sát O'đang ở trong người quan sát chuyển động wrt Ovớ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 Otọ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?


Đây thực sự là một phép biến đổi tuyến tính, không phải phi tuyến tính, như wiki mà bạn đã liên kết. Vì vậy, những gì bạn thấy âm thanh ok, tuy nhiên, khó có thể nói chắc chắn mà không nhìn thấy nó.
Maik

Bạn có thể dùng thử shader này trong ShaderMaker để xem các hiệu ứng, nhưng điều tôi muốn đạt được là hiệu ứng này: spacetimetravel.org/relaflug/relaflug.html Ở đây chúng ta sẽ thấy sự co lại theo chiều dọc trên trục x nhưng tôi thấy tỷ lệ không chính xác
linello

Bạn có thực sự di chuyển máy ảnh? Liên kết spacetimetravle đi kèm với mã nguồn, có thể đáng để xem ở đó
Maik Semder

tốc độ 0,5 c / s hơi nhỏ, hãy thử sử dụng thứ gì đó lớn hơn 0,9, ví dụ sử dụng 0,93 c / s và di chuyển máy ảnh với tốc độ đó
Maik Semder

Không, tôi cho rằng người quan sát 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 Ovới vận tốc v_xvà 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
linello

Câu trả lời:


4

Để thực hiện co rút Lorentz, đặt cược tốt nhất của bạn có lẽ chỉ là quy mô rõ ràng đối tượng theo 1 / gamma theo hướng chuyển động.

Vấn đề là phép biến đổi Lorentz thay thế các đỉnh theo hướng thời gian cũng như trong không gian, do đó, chính nó sẽ không cung cấp cho bạn vật thể chuyển động trông như thế nào tại một thời điểm cụ thể. Để làm điều đó, trước tiên bạn sẽ phải chuyển đổi toàn bộ đối tượng sau đó lấy một "lát" xuyên qua nó song song với các trục không gian, như trong sơ đồ này:

Sơ đồ không gian thời gian co rút Lorentz

Để tính toán điều này thành sự thật, bạn thực sự phải chiếu tia trong 4D, giao giữa đường thế giới của đỉnh với siêu phẳng 3D của thời điểm hiện tại trong khung tham chiếu của người quan sát. Tôi tin rằng kết quả của việc này giống như chỉ đơn giản là nhân rộng 1 / gamma.

(Để có thêm tín dụng, hãy tính đến thực tế là một người quan sát sẽ không thực sự nhìn thấy toàn bộ vật thể tại một thời điểm: họ sẽ nhìn thấy nó bằng các tia sáng. Vì vậy, bạn cần phải giao nhau giữa thế giới của đỉnh với hình nón ánh sáng quá khứ của người quan sát. Điều này thực sự thay đổi kết quả đáng kể: một vật di chuyển ra xa bạn sẽ trông ngắn lại, nhưng một vật di chuyển về phía bạn sẽ xuất hiện kéo dài và một vật chuyển động sang một bên sẽ được xoay - xem xoay Penrose-Terrell để biết thêm.)


Ok, nhưng nếu tôi thay đổi thời gian bên trong mô phỏng thì sao? Tôi coi thời gian là một cái phao thống nhất được truyền từ bên ngoài shader, cái này có nên làm biến dạng vật thể đúng lúc không?
linello

Nếu thời gian là một hằng số cho mỗi khung hình, thì bạn đang sử dụng một lát cắt thời gian 3D của thế giới 4D, vì vậy, những gì tôi đã nói ở trên giữ vững.
Nathan Reed

Tôi cũng không hiểu nếu tôi phải thực hiện quang sai tương đối tách biệt với phép biến đổi Lorentz.
linello

@linello Nếu bạn quan tâm đến quang sai, có vẻ như bạn cần phiên bản phức tạp hơn của điều này tôi đã mô tả trong đoạn cuối - nghĩa là giao giữa đường thế giới của đỉnh với hình nón ánh sáng trong quá khứ của người quan sát và di chuyển đỉnh đến điểm giao nhau Vị trí không gian. Điều đó nên được thực hiện trong shader đỉnh, tôi nghĩ. Biến đổi Lorentz sẽ chỉ tham gia vào việc thiết lập đường thế giới của đỉnh. Cũng lưu ý rằng nếu đối tượng đang tăng tốc, quay, v.v. thì đường thế giới bị cong.
Nathan Reed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.