Görünüm matrisinden çeviri nasıl alınır


11

Kameranın dünya-uzay konumunu bakış matrisinden nasıl alabilirim? Bu soruya gördüğüm tek cevap, çevirinin son satır / sütunta olduğunu gösteriyor ancak matris [x (nokta) sağ, y (nokta) yukarı, z (nokta) görünüm] içerdiğinden bu işe yaramayacak

Yanıtlar:


10

Kısa cevap

Önce görünüm matrisini ters çevirin. Ardından, son satırdan / sütundan çeviriyi getirin.

Uzun cevap

Bir görünüm matrisinin içeriğini çıkarmanın bir yolu, kamerayı dünyadaki herhangi bir nesne olarak düşünerek ve bunun için bir dünya matrisi hesaplayarak başlamaktır:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Bir dünya matrisi, koordinatları yerel uzaydan dünya uzayına dönüştürür. Ancak bu durumda, kameranın yerel alanı ve görüş alanı bir ve aynıdır, bu nedenle bu matrisin koordinatları görüş alanından dünya alanına dönüştürdüğünü söyleyebiliriz.

Ters yönde bir dönüşüme ihtiyacımız olduğundan, matrisi tersine çevirmeliyiz. Sonuç, koordinatları dünya uzayından uzaya dönüştüren bakış matrisi olarak adlandırdığımız şeydir :

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

Ve bu, sahip olduğunuz bir çeşit matristir. Bu nedenle, kamera konumunu ondan geri almak için, önce ters çevirmeniz gerekir ve ardından çeviriyi son satırdan (veya sisteme bağlı olarak sütun) alabilirsiniz.


1
Neden matrisi önce tersine çevirelim? (Umarım) satır-büyük veya sütun-büyük olup olmadığınızı biliyorsanız, çeviri vektörünün konumu açık olmalıdır.
3Dave

7

Öncelikle konumu ayrı ayrı bir vektör olarak saklamanızı şiddetle tavsiye ederim, işleri hesaplama açısından çok daha kolay hale getirecektir. Neyse...

[x (dot) right, y (dot) up, z (dot) look]gerçek görünüm matrisi değildir. Matrisin kendisi şu şekildedir:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

sol üst 3x3 matrisi dönüşleri, ölçeği vb. temsil eder. Kameranın tüm yönü orada yapılır. Kalan satır ve sütun çeviri ve şu anda girmeyeceğim diğer karmaşık perspektif şeyler için kullanılır.

Matrisi elde ettiğinizde (4x4 matrisi olduğu varsayılarak), matris sınıfınızın satır-büyük veya sütun-büyük sıralama olmasına bağlı olarak çeviri her zaman ya son satırda ya da son sütunda saklanır.

Muhtemelen karıştırdığınız şey nokta ürünlere ihtiyacınız olmasıdır. Olanlar matris matematiğinin basitleştirilmesidir, bu Yığın Taşması sorusunda daha ayrıntılı cevaplar vardır: /programming/349050/calculating-a-lookat-matrix

Çözüm burada bulunabilir , matrisin tersini almanız ve bunun çevirisini almanız gerekir:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

Buradaki diğer cevaplar, kamera pozisyonunu kamera matrisinden nasıl tersine alacağınızı açıklar.

Kamera matrisinin 3x3'lük kısmında genellikle olduğu gibi yalnızca döndürme (ölçeklendirme veya kesme yok) varsa, hesaplama, kamera matris çevirisi ile kamera dönüşünün çarpımı ile çarpılarak optimize edilebilir. Kamera pozisyonu daha sonra dönüştürülmüş çeviri vektörü -1 ile çarpılır. GLSL'de bu:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

veya

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

Kamera konumunu üniforma olarak hesaplamak ve geçmek istemiyorsam, tepe gölgelendiricilerimde kullandığım budur.

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.