Bir dönüşüm matrisinden yönlendirmeyi nasıl çıkarabilirsiniz?


10

Bir 4x4 dönüşüm matrisim M var ve M tarafından dönüştürüldüğünde bir kürenin şeklini bulmak istiyorum (Küre orijinlidir ve yarıçap 1'e sahiptir.)

Merkezi M'yi (0,0,0,1) ile çarparak bulabileceğimi biliyorum.

Bununla birlikte, M küreyi ezip döndürebildiğinden yarıçap bir problem haline gelir. Ortaya çıkan elipsoidin yeni yarıçaplarını nasıl bulabilirim? Oryantasyonu bulmanın bir yolu var mı?

Daha spesifik olarak, dönüştürülmüş küreyi çevreleyecek olan sınırlayıcı kürenin boyutunu bilmem gerekir. Başka bir deyişle, V'nin bir birim vektör (orijinal kürenin üzerindeki bir nokta) olduğu maksimum | M * V - M * (0,0,0,1) |


1
Dönüştürülmüş eksen vektörlerinin uzunluğunu hesaplayamaz mısınız? (Matrisinizin rotasyon kısmının 3 sütunu) Sınırlayıcı kürenin en uzun vektörün uzunluğuna eşit bir yarıçapı olacaktır.
Bart

Hayır, bunun doğru olduğunu düşünmüyorum. En uzun yön eksenle hizalanamayabilir. (Ezip ezdiğinizi, döndürdüğünüzü, tekrar ezdiğinizi, biraz daha döndürdüğünüzü hayal edin.)
CaptainCodeman

Hmm, bunun önemli olduğundan emin değilim. Kendimi ikna etmeyi başarabilirsem bugün daha sonra bir cevap yazacağım. ;)
Bart

Sorun, SCALE dönüşümü yaparsanız, M matrisinin taban vektörlerinin birbirine ORTOGONAL kalması gerekmez.
GPUquant

Yanıtlar:


6

Matematiksel olarak, sorduğunuz miktara operatör normu denir . Ne yazık ki, bunun için basit bir formül yok. Tamamen genel bir afin dönüşüm ise - örneğin, herhangi bir sırayla rastgele bir dönme ve üniform olmayan ölçek kombinasyonuna sahip olabilirse - o zaman bunun tekil değer ayrışmasını kullanmaktan başka bir şey olmadığından korkuyorum . Matrisinize SVD uygularsanız, en büyük tekil değer, elde edilen elipsoidin maksimum yarıçapı olacaktır. Diğer tekil değerler de diğer iki yarıçapı olacaktır ve SVD prosedürü sizin için eksenlerin yönünü de çıkarabilir.

SVD uygulamak özdeğerler bulmayı içerdiğinden, kalbin zayıflığı için değildir. İstediğiniz tekil değerlerin kendileriyse, bunlar M ^ T * M'nin öz değerlerinin kare köküdür. Yani 3x3 özdeğer çözücünüz varsa veya bir tane yazmanın sakıncası yoksa bunu kullanabilirsiniz. Eksenlerin yönlerini de çıkarmak istiyorsanız, özvektörleri bulmanız gerektiğinden daha fazla dahil olur. Bu Wikipedia makalesinde, biri projenizde kullanabileceğiniz SVD yapmak için kütüphanelere bağlantıların bir listesi vardır.

Matrisinizin şekli, eşit olmayan ölçek en fazla bir kez olacak ve ilk dönüşüm uygulanacak şekilde kısıtlanmışsa, yani sütun vektörlerini kullanırken en sağdaysa, bunu yalnızca dönüştürülmüş eksen vektörleri. Bu durumda tek başına - yani tek bir tekdüze ölçek, ardından herhangi bir dönme, yansıma ve tek biçimli ölçek dizisi - sadece eksen vektörlerine bakmak size doğru cevabı verecektir.


Teşekkürler, detaylı yanıtı takdir ediyorum. Diğer cevapta verilen bozunma nerede işe yaramaz?
CaptainCodeman

2
@CaptainCodeman Diğer cevap, üçüncü paragrafımda açıkladığım gibi, sadece dönüştürülmüş eksen vektörlerine (yani matrisin sütunlarına) bakmaktır. Bir dönüşten sonra düzgün olmayan bir ölçek olması durumunda başarısız olur, çünkü o zaman ölçeklendirme orijinal eksenler boyunca geçerli değildir.
Nathan Reed

2

Belki matristen ölçek faktörlerini ayıklayın ve ardından bileşenlerinin maksimum değerini kullanın. SRT (Ölçek-Döndürme-Çeviri) matrisini kullanarak bunu şöyle yapabilirsiniz:

glm::mat4 m = ...;
// Extract col vectors of the matrix
glm::vec3 col1(m[0][0], m[0][1], m[0][2]);
glm::vec3 col2(m[1][0], m[1][1], m[1][2]);
glm::vec3 col3(m[2][0], m[2][1], m[2][2]);
//Extract the scaling factors
glm::vec3 scaling;
scaling.x = glm::length(col1);
scaling.y = glm::length(col2);
scaling.z = glm::length(col3);

float scaleFactor = MAX(scaling.x, MAX(scaling.y, scaling.z));

( http://wklej.org/id/950061/ - adı decomposeTRS ve decomposeSRT değil çünkü OpenGL'de hangi matrislerin çarpıldığı sırayla isimler kullanıyorum).

Artık orijinal küre yarıçapını scaleFactor ile çarpabilir ve sınırlayıcı küreniz olur.

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.