GLSL'de özel görelilik gölgelendiricisi


11

Özel görelilik Lorentz Dönüşümünü anlamaya yardımcı olan bir GLSL gölgelendirici uygulamaya çalışıyorum.

İki eksene hizalanmış atalet gözlemcisi alalım Ove O'. Gözlemci O'hareket wrt gözlemci olan Ohız ile v=(v_x,0,0).

O'Koordinatlar açısından tanımlandığında , bir olay P' = (x',y',z',ct')koordinatları dönüştürdü(x,y,z,ct)= L (x',y',z',ct')

burada L, P 'olayının koordinatlarını koordinatlarda yazmamıza yardımcı olan Lorentz dönüşümü adı verilen 4x4 bir matristir O.

(ayrıntılar için bkz. http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-direction )

Her tepe noktasına hız verildiğinde Lorentz dönüşümünü uygulayan ilk ön köşe gölgelendiricisini yazdım, ancak dönüşümü doğru şekilde çalıştıramıyorum.

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) );

Bu gölgelendirici her tepe noktasına uygulanmalı ve doğrusal olmayan Lorentz dönüşümünü gerçekleştirmelidir, ancak gerçekleştirdiği dönüşüm beklediğimden açıkça farklıdır (bu durumda x ekseni üzerinde bir uzunluk daralması).

Birisi zaten 3D video oyunu için özel görelilik gölgelendirici üzerinde çalıştı mı?


Aslında, bağladığınız wiki gibi doğrusal olmayan bir dönüşümdür. Gördüğünüz şey iyi görünüyor, ancak görmeden kesin olarak söylemek zor.
Maik Semder

ShaderMaker'da efektleri görmek için bu gölgelendiriciyi deneyebilirsiniz, ancak elde etmek istediğim şey bu etkidir: spacetimetravel.org/relaflug/relaflug.html Burada x ekseni üzerindeki uzunluk daralmasını görmeliyiz ama yanlış bir ölçekleme görüyorum
linello

Gerçekten kamerayı hareket ettiriyor musunuz? Spacetimetravle-link kaynak kodu ile birlikte gelir, orada bir göz atmaya değer olabilir
Maik Semder

ayrıca hız 0.5 c / s biraz küçük, 0.9'dan daha büyük bir şey kullanmayı deneyin, örnek 0.93 c / s kullanıyor ve kamerayı bu hızda hareket
ettiriyor

Hayır gözlemci O(0,0,0) z-eksenine bakarken gözlemci hız ile O'hareket halindeyken ve açıklanan nesneler hareketsizken sanırım . Bu köşe gölgeleyicisinde dönüşümün yalnızca köşeler için uygulandığını biliyorum, böylece çizgilerin deformasyonu kaybolur, ancak sadece bunu ilk başta anlamak ve çalışmak istiyorum. Görünüşe göre Polinom oyunu zaten bu tür dönüşümler yaptı, ama bulduğum gölgelendirici ilginç bir şey değil, çünkü aynı sonuçları elde ediyorum! bit.ly/MueQqoOv_xO'
linello

Yanıtlar:


4

Lorentz kasılmasını uygulamak için en iyi seçeneğiniz muhtemelen nesneyi hareket yönü boyunca açıkça 1 / gama ile ölçeklendirmektir.

Sorun şu ki, Lorentz dönüşümü, zaman yönünün yanı sıra uzayda da köşeleri yer değiştiriyor, bu nedenle tek başına, hareket eden bir nesnenin belirli bir zamanda neye benzediğini vermeyecek. Bunu yapmak için, önce tüm nesneyi dönüştürmeniz, ardından bu diyagramdaki gibi boşluk eksenlerine paralel olarak bir "dilim" almanız gerekir:

Lorentz kasılma uzay-zaman diyagramı

Bunu gerçek olarak hesaplamak için, 4D'de etkili bir şekilde ışın izlemeniz gerekir, tepe noktasının dünya çizgisini gözlemcinin referans çerçevesindeki geçerli anın 3D hiper düzlemiyle kesişirsiniz. Bunu yapmanın sonucunun sadece 1 / gamma ile ölçeklendirmeyle aynı olduğuna inanıyorum.

(Ekstra kredi için, bir gözlemcinin tüm nesneyi tek bir anda görmeyeceğini göz önünde bulundurun: ışık ışınları kullanarak görecekler. Bu yüzden Bu aslında sonuçları önemli ölçüde değiştirir: sizden uzaklaşan bir nesne kısaltılmış görünecek, ancak size doğru hareket eden bir nesne uzamış görünecek ve yanlara doğru hareket eden bir nesne döndürülecektir - bkz. Penrose-Terrell dönüşü daha fazlası için.)


Tamam, ama simülasyon içindeki zamanı değiştirirsem ne olur? Zamana gölgelendiricinin dışından geçecek tekdüze bir şamandıra gibi davranıyorum, bu nesneyi zamanında deforme etmeli mi?
linello

Zaman her kare için sabitse, 4D dünyasının 3D zaman dilimini alıyorsunuz, bu yüzden evet, yukarıda söylediğim şey tutar.
Nathan Reed

Relativistik sapmayı Lorentz dönüşümünden ayrı olarak uygulamak zorunda olup olmadığımı da anlamıyorum.
linello

@linello Sapmayı önemsiyorsanız, son paragrafta tarif ettiğim bunun daha karmaşık bir versiyonuna ihtiyacınız var gibi görünüyor - yani, tepe noktasının dünya çizgisini gözlemcinin geçmiş ışık konisiyle kesiştirin ve tepe noktasını kesişim noktasına taşıyın Uzaysal konum. Bu, tepe gölgeleyicisinde yapılabilir olmalı, sanırım. Lorentz dönüşümü yalnızca tepe noktasının dünya çizgisinin kurulmasında rol oynayacaktır. Ayrıca, nesne hızlanıyorsa, dönüyorsa, vb. İse, dünya çizgisinin eğri olduğunu unutmayın.
Nathan Reed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.