ฉันพยายามใช้ GLSL shader ซึ่งช่วยทำความเข้าใจสัมพัทธภาพพิเศษ Lorentz Transformation
ลองมาสองแกนชิดสังเกตการณ์เฉื่อย และO
O'
ผู้สังเกตการณ์O'
อยู่ในการเคลื่อนไหวสังเกตการณ์ WRT ด้วยความเร็ว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 )
ฉันได้เขียน Shader Vertex เบื้องต้นตัวแรกที่ใช้การแปลงแบบลอเรนซ์ที่กำหนดความเร็วให้กับทุกจุดสุดยอด แต่ฉันไม่สามารถทำให้การแปลงทำงานได้อย่างถูกต้อง
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) );
Shader นี้ควรใช้กับทุก ๆ จุดสุดยอดและทำการแปลงแบบลอเรนซ์ที่ไม่เป็นเชิงเส้น แต่การแปลงที่กระทำนั้นแตกต่างอย่างชัดเจนจากสิ่งที่ฉันคาดหวัง (ในกรณีนี้คือการหดตัวยาวบนแกน x)
มีใครบางคนที่ทำงานเกี่ยวกับทฤษฎีสัมพัทธภาพพิเศษสำหรับวิดีโอเกม 3 มิติหรือไม่?
O
อยู่ใน (0,0,0) มองลงไปที่แกน z ในขณะที่ผู้สังเกตการณ์O'
กำลังเคลื่อนไหวO
ด้วยความเร็วv_x
และวัตถุที่อธิบายไว้O'
นั้นนิ่ง ฉันรู้ว่าในจุดยอดสุดยอดนี้การเปลี่ยนแปลงจะถูกนำไปใช้กับจุดยอดเท่านั้นดังนั้นการเสียรูปของเส้นจะหายไป แต่ฉันแค่ต้องการที่จะเข้าใจและทำงานในตอนแรก ดูเหมือนว่าเกม Polynomial ได้ทำการแปลงรูปแบบนี้แล้ว แต่ shader ที่ฉันพบไม่มีอะไรน่าสนใจเพราะฉันได้รับผลลัพธ์เดียวกัน! bit.ly/MueQqo