3B döndürme matrisini (4x4) bileşen parçalarına (döndürme, ölçek vb.) Çevirmek mümkün müdür?


11

Daha somut olmak için, bir iOS uygulaması üzerinde çalışıyorum ve bir yapıya sahibim CATransform3D(temelde 4x4 dönüşüm dizisi).

Bu matrisin tüm farklı "işlemlerini" çıkarmak mümkün müdür? Ne kadar dönme, ölçek vb. Anlamına geliyor?

Yanıtlar:


10

matrisini temel dönüşümlere ayırabilirsiniz : çeviri, ölçekleme ve döndürme. Bu matris göz önüne alındığında:M=TRS

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

son sütununu kullanarak çeviriyi inceleyerek ayrıştırabilirsiniz .t=(a03,a13,a23)

Ölçeklendirme için, matrisin ilk üç sütununun bazlara (eksenlere) karşılık geldiğini biliyoruz. Ölçeği bu vektörlerin uzunluğuna / normuna, yani bazların ne kadar ölçeklendiğine göre alabiliriz. Yani ölçek burada:s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Şimdi ölçek, kullandığınız ondan kurtulmak yapabilirsiniz gelmiş alt matris olduğunu karşılık için ölçek ters çevrilip matrisi çarpılarak için getR, S S - 1 R,3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Böylece ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

Bu son dönme matrisidir. Birçok yolla daha fazla ayrıştırabilirsiniz. Uzun bırakıldı, ancak bir döndürme matrisinin ayrıştırılmasını arayabilirsiniz .


Bu yöntem yalnızca çeviri, ölçekleme ve döndürme şeklinde eşdeğer bir değer verir (orijinal matris, diğer dönüşüm türlerinin sonucu olabilir). Ayrıştırılmış açıları daha fazla kullanırsanız, dönme açıları ile kayan nokta hassasiyeti ile ilgili problemler olabilir, hesaplamalarda yuvarlama hataları birikebilir. Matrisi kendiniz oluşturmadığınız sürece kullanmamalısınız.

Matrisi oluşturan ve çeviriyi, ölçeği ve döndürmeyi ayrı ayrı ve bağımsız olarak düzenlemek ve görüntülemek için ayrıştırma yapmak istiyorsanız, muhtemelen , bileşenlerini depolamak Bir dönüşüm sınıfında ve ayrı ayrı vektörler olarak (döndürme için kuaterniyon olabilir). Yalnızca dönüştürme matrisine ihtiyacınız olduğunda , bu bileşenlerden bir matrisi oluşturun (Bazı bileşenler değiştirilene kadar matrisi önbelleğe alabilirsiniz).s r T R StsrTRS


2
Kayan nokta hassasiyeti ile ilgili problemlerin ne olduğunu açıklayabilir misiniz? Ölçek gerçekten aşırı olmadıkça, bu yöntemde hassas sorunlara neden olacak hiçbir şey görmüyorum. Ayrıca, eğer matris hem muntazam olmayan ölçekleri hem de rotasyonları içeren bir matris dizisinden oluşmuşsa, bu yöntemin başarısız olabileceğini belirtmek gerekir. matris bu durumda bir rotasyon için dönecek, ancak kesme içerecektir. R
Nathan Reed

2
Tüm kayan nokta numaralarının özünde (sınırlı) hatası vardır. İşlemleri, özellikle toplama veya çıkarma işlemini her gerçekleştirdiğinizde, sınırın büyüklüğünü artırarak hatayı bir araya getirirsiniz. Ayrıştırma algoritmasında gizlenen birçok ekleme işlemi (hem matris çarpımında hem de ölçek büyüklüğü hesaplamasında) ve bir kare kökü (ölçekte) vardır. Daha fazla bozunma daha fazla hataya neden olur.
Timbo

1
@Timbo Burada tam matris çarpımı yok, sadece matrisin sütunlarını ters ölçeklerle çarpıyoruz. Bir vektör büyüklüğü, tüm pozitif miktarları eklemeyi içerir, bu nedenle orada felaketli bir iptal yoktur; çok fazla göreceli hata üretmez, AFAICT. Her neyse, yazar rotasyon matrisini Euler açılarına veya benzeri bir şeye daha fazla ayrıştırmaktan bahsettiklerini açıkladı.
Nathan Reed

Teşekkürler - harika cevap. Takip: Orijinal matrisi geri almak için, kimlik matrisinden başlayarak belirli bir işlem sırasını izlememiz gerektiğini varsayıyorum. Bu sipariş TRS olur mu?
elsurudo
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.