ทฤษฎีสัมพัทธภาพพิเศษใน GLSL


11

ฉันพยายามใช้ GLSL shader ซึ่งช่วยทำความเข้าใจสัมพัทธภาพพิเศษ Lorentz Transformation

ลองมาสองแกนชิดสังเกตการณ์เฉื่อย และO O'ผู้สังเกตการณ์O'อยู่ในการเคลื่อนไหวสังเกตการณ์ WRT ด้วยความเร็วOv=(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 มิติหรือไม่?


อันที่จริงแล้วเป็นการแปลงเชิงเส้นไม่ใช่ไม่ใช่เชิงเส้นเนื่องจากวิกิที่คุณเชื่อมโยงรัฐ ดังนั้นสิ่งที่คุณเห็นเสียงก็โอเค แต่ยากที่จะพูดอย่างแน่นอนโดยไม่เห็นมัน
Maik Semder

คุณสามารถลองใช้ shader นี้ใน ShaderMaker เพื่อดูเอฟเฟกต์ แต่สิ่งที่ฉันต้องการให้บรรลุคือเอฟเฟกต์นี้: spacetimetravel.org/relaflug/relaflug.html ที่นี่เราจะเห็นการหดตัวของความยาวบนแกน x แต่ฉันเห็นการปรับขนาดไม่ถูกต้อง
linello

คุณย้ายกล้องจริงๆหรือ spacetimetravle-link มาพร้อมกับซอร์สโค้ดซึ่งอาจคุ้มค่าที่จะดู
Maik Semder

นอกจากนี้ยังมีความเร็ว 0.5 C / S เป็นบิตขนาดเล็กลองใช้สิ่งที่ใหญ่กว่า 0.9 การใช้งานตัวอย่างเช่น 0.93 C / s และย้ายกล้องด้วยความเร็วที่
Maik Semder

ไม่ฉันคิดว่าผู้สังเกตการณ์Oอยู่ใน (0,0,0) มองลงไปที่แกน z ในขณะที่ผู้สังเกตการณ์O'กำลังเคลื่อนไหวOด้วยความเร็วv_xและวัตถุที่อธิบายไว้O'นั้นนิ่ง ฉันรู้ว่าในจุดยอดสุดยอดนี้การเปลี่ยนแปลงจะถูกนำไปใช้กับจุดยอดเท่านั้นดังนั้นการเสียรูปของเส้นจะหายไป แต่ฉันแค่ต้องการที่จะเข้าใจและทำงานในตอนแรก ดูเหมือนว่าเกม Polynomial ได้ทำการแปลงรูปแบบนี้แล้ว แต่ shader ที่ฉันพบไม่มีอะไรน่าสนใจเพราะฉันได้รับผลลัพธ์เดียวกัน! bit.ly/MueQqo
linello

คำตอบ:


4

ในการใช้การบีบอัด Lorentz ทางออกที่ดีที่สุดของคุณอาจเป็นเพียงการปรับขนาดวัตถุโดย 1 / แกมม่าตามทิศทางของการเคลื่อนไหว

ปัญหาคือการแปลง Lorentz แทนที่จุดในทิศทางเวลาและในอวกาศดังนั้นโดยตัวมันเองมันจะไม่ให้สิ่งที่วัตถุเคลื่อนที่ดูเหมือนในช่วงเวลาเฉพาะ ในการทำเช่นนั้นคุณจะต้องแปลงวัตถุทั้งหมดก่อนจากนั้นนำ "ชิ้น" ผ่านมันขนานกับแกนอวกาศเช่นในแผนภาพนี้:

แผนภาพเวลา - หด Lorentz

ในการคำนวณสิ่งนี้สำหรับของจริงคุณจะต้องทำการ raytrace ใน 4D โดยการตัดกันจุดยอดของโลกด้วยไฮเปอร์เพลนแบบ 3D ของช่วงเวลาปัจจุบันในกรอบอ้างอิงของผู้สังเกตการณ์ ฉันเชื่อว่าผลลัพธ์ของการทำเช่นนี้เหมือนกับการปรับเพียง 1 / gamma

(สำหรับเครดิตเพิ่มเติมให้คำนึงถึงความจริงที่ว่าผู้สังเกตการณ์จะไม่เห็นวัตถุทั้งหมดในเวลาเดียวพวกเขาจะเห็นมันโดยใช้แสงรังสีดังนั้นคุณจะต้องตัดกันเส้นโลกของ จุดสุดยอดด้วยกรวยแสงที่ผ่านมาของผู้สังเกตการณ์การเปลี่ยนแปลงผลลัพธ์อย่างมีนัยสำคัญจริง ๆ : วัตถุที่เคลื่อนที่ออกไปจากคุณจะดูสั้นลง แต่วัตถุที่เคลื่อนที่เข้าหาคุณจะปรากฏยาวและวัตถุเคลื่อนที่ไปทางด้านข้าง หมุน - ดูเพนโรส-เทอร์เรหมุนเพื่อเพิ่มเติม)


ตกลง แต่ถ้าฉันเปลี่ยนเวลาในการจำลอง? ฉันปฏิบัติต่อเวลาในรูปแบบลอยตัวที่ต้องผ่านจากนอก shader สิ่งนี้ควรทำให้วัตถุในเวลาถูกต้องหรือไม่
linello

ถ้าเวลาเป็นค่าคงที่สำหรับแต่ละเฟรมคุณจะเข้าสู่การแบ่งเวลา 3 มิติของโลก 4D ดังนั้นใช่สิ่งที่ฉันพูดไว้ข้างต้นถือ
นาธานรีด

ฉันไม่เข้าใจเช่นกันถ้าฉันต้องใช้ความคลาดเคลื่อนสัมพัทธ์แยกจากการแปลงแบบลอเรนซ์
linello

@linello หากคุณสนใจเรื่องความผิดเพี้ยนดูเหมือนว่าคุณต้องการรุ่นที่ซับซ้อนกว่านี้ที่ฉันได้อธิบายไว้ในย่อหน้าสุดท้ายนั่นคือตัดจุดยอดของโลกด้วยกรวยแสงที่ผ่านมาของผู้สังเกตการณ์และย้ายจุดยอดไปยังจุดตัด ตำแหน่งเชิงพื้นที่ ฉันคิดว่าน่าจะทำได้ในจุดสุดยอด การแปลงแบบลอเรนซ์จะมีส่วนร่วมในการจัดตั้งแนวหน้าของโลก โปรดทราบด้วยว่าหากวัตถุนั้นกำลังเร่งหมุน ฯลฯ จากนั้นเส้นโลกจะโค้ง
นาธานรีด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.