Yanıtlar:
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.
Ö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;
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.