Yanıtlar:
Evet, çeviri durumunda bir vektör ekleyebilirsiniz. Bir matris kullanma nedeni, farklı kombine dönüşümleri idare etmek için tek biçimli bir yola sahip olmaktan kaynaklanır.
Örneğin, rotasyon genellikle bir matris kullanılarak yapılır (rotasyonlarla başa çıkmak için diğer yollar için @MickLH yorumunu kontrol edin); Onları bir matriste kodlamanız gerekir.
Şey, teknik olarak konuşursak; bir dönüşüm bir noktayı / vektörü başka bir noktaya / vektöre eşliyor.
p` = T(p);
p ', dönüştürülen nokta ve T (p), dönüşüm işlevidir.
Bir matris kullanmadığımız göz önüne alındığında, bunu birden çok dönüşümü birleştirmek için yapmamız gerekir:
p1 = T (p);
p final = M (p1);
Yalnızca bir matris birden fazla dönüşüm türünü tek bir matriste birleştiremez (örneğin, afin, doğrusal, projektif).
Bir matris kullanmak, bize dönüşüm zincirlerini birleştirme ve ardından kümeleri çoğaltma fırsatı verir. Bu bize genellikle GPU tarafından bir ton döngü kazandırır (bunu işaret ettiği için @ ChristianRau'ya teşekkürler).
T final = T * R * P; // döndürme projesini çevir
p final = T final * p;
Ayrıca GPU'ların ve hatta bazı CPU'ların vektör işlemleri için optimize edildiğini belirtmek iyidir; SIMD ve GPU'ları kullanan CPU'lar tasarımla veri odaklı paralel işlemcilerdir, bu nedenle matris kullanımı donanım hızlandırmaya mükemmel bir şekilde uyar (aslında, GPU'lar matris / vektör işlemlerine uyacak şekilde tasarlanmıştır).
Tek yapmanız gereken tek bir eksen boyunca hareket etmek ve başka herhangi bir dönüşümü uygulamak değilse, önerdiğiniz şey iyidir.
Bir matris kullanmanın gerçek gücü, bir dizi karmaşık işlemi kolayca bir araya getirip aynı işlemi birden çok nesneye uygulayabilmenizdir.
Çoğu durumda bu kadar basit değildir ve önce nesneyi döndürürseniz ve dünya eksenleri yerine yerel eksenleri arasında geçiş yapmak istiyorsanız, sayılardan birine 10 ekleyemezsiniz ve doğru şekilde çalışmasını sağlayamazsınız. .
"Neden" sorusunu kısaca cevaplamak için, bunun nedeni bir 4x4 matrisinin döndürme, çeviri ve ölçeklendirme işlemlerini aynı anda tanımlayabilmesidir. Bunlardan herhangi birini tutarlı bir şekilde tanımlayabilmek birçok şeyi basitleştirir.
Farklı dönüşüm türleri, farklı matematiksel işlemlerle daha basit bir şekilde gösterilebilir. Not ettiğiniz gibi, çeviri sadece ekleyerek yapılabilir. Bir skalar ile çarparak tek tip ölçeklendirme. Ancak uygun şekilde hazırlanmış bir 4x4 matris her şeyi yapabilir. Bu yüzden 4x4'leri sürekli kullanmak kod ve arayüzleri çok daha basit hale getirir. Bu 4x4'leri anlamakta biraz karmaşıklık ödersiniz, ancak daha sonra birçok şey daha kolay ve daha hızlı olur.
4x4 matrisi kullanmanın nedeni operasyonun doğrusal bir dönüşüm olmasıdır . bu homojen koordinatlara bir örnektir . Aynı şey 2d durumda da yapılır (3x3'lük bir matris kullanılarak). Homojen koordinatların kullanılmasının nedeni, 3 geometrik tansformun hepsinin bir işlem kullanılarak yapılabilmesidir; Aksi halde 3x3'lük bir matris çarpımı ve 3x3'lük bir matris eklenmesi gerekir (çeviri için). cegprakash'tan bu link faydalıdır.
Çeviriler 3D matrislerle temsil edilemez
Basit bir argüman, çevirinin orijin vektörünü alabilmesidir:
0
0
0
Kökenden uzak, söyle ki x = 1
:
1
0
0
Ancak bu böyle bir matris gerektirir:
| a b c | |0| |1|
| d e f | * |0| = |0|
| g h i | |0| |0|
Ama bu imkansız.
Diğer bir argüman, her matrisin iki döndürme ve bir ölçeklendirme işlemi ile oluşturulabileceğini söyleyen Tekil Değer Ayrıştırma teoremidir . Orada çeviri yok.
Neden matrisler kullanılabilir?
Birçok modellenen nesne (örneğin bir araç şasisi) veya modellenen nesnelerin bir kısmı (örneğin bir araba lastiği, bir sürüş tekerleği) katıdır: tepe noktaları arasındaki mesafeler asla değişmez.
Onlara yapmak istediğimiz dönüşümler sadece çeviriler ve çevirilerdir.
Matris çarpımı, hem dönüşleri hem de çevirileri kodlayabilir.
Rotasyon matrisleri açık formüllere sahiptir, örneğin: açı için bir 2D rotasyon matrisi a
formdadır:
cos(a) -sin(a)
sin(a) cos(a)
3D için benzer formüller vardır , ancak 3D döndürmelerin yalnızca 1 yerine 3 parametre aldığını unutmayın .
Tercümeler daha az önemsizdir ve daha sonra tartışılacaktır. 4D matrislere ihtiyacımızın nedeni onlar.
Matris kullanmak neden havalı?
Çünkü çoklu matrislerin bileşimi matris çarpımı ile önceden hesaplanabilir .
Örneğin, v
araç kasamızın bin vektörünü matris ile çevirip T
daha sonra matrisle döndürmek istiyorsak R
:
v2 = T * v
ve sonra:
v3 = R * v2
Her vektör için, ön hesaplama yapabiliriz:
RT = R * T
ve sonra her köşe için yalnızca bir çarpma yapın:
v3 = RT * v
Daha da iyisi: o zaman lastiğin ve sürüş tekerleğinin tepe noktalarını araca göre yerleştirmek istiyorsak, önceki matrisi RT
aracın kendisine göre olan matris ile çarpıyoruz.
Bu doğal olarak bir yığın matrisin korunmasına yol açar :
Bir boyutun eklenmesi sorunu nasıl çözer?
1D'den 2D'ye kadar olan durumu görselleştirmesi daha kolay olan düşünelim.
1D'deki bir matris sadece bir sayıdır ve 3B'de gördüğümüz gibi çeviri yapamaz, sadece ölçeklendirme yapar.
Fakat eğer ekstra boyutu şöyle eklersek:
| 1 dx | * |x| = | x + dx |
| 0 1 | |1| | 1 |
ve sonra yeni ekstra boyutu unuturuz:
x + dx
istediğimiz gibi.
Bu 2B dönüşümü bir isme sahip olması için çok önemlidir: kayma dönüşümü .
Bu dönüşümü görselleştirmek havalıdır:
Her yatay çizginin (sabit y
) nasıl çevrileceğini not edin .
Satırı y = 1
yeni 1D hattımız olarak kabul ettik ve 2D matrisle çevirdik.
Her şey 3B'ye benzer, formun 4D kayma matrisi ile:
| 1 0 0 dx | | x | | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz | | z | | z + dz |
| 0 0 0 1 | | 1 | | 1 |
Ve eski 3D rotasyonlarımız / ölçeklememiz artık formda:
| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |
Bu Jamie King video eğitimi de izlemeye değer.
Afin alan
Afin uzay, tüm 3B doğrusal dönüşümlerimiz (matris çarpımları) ile birlikte 4B kayma (3B çeviriler) tarafından üretilen alandır.
Bir kesme matrisini ve bir 3D doğrusal dönüşümü çarparsak, her zaman aşağıdaki formdan bir şey alırız:
| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0 1 |
Bu, 3B döndürme / ölçekleme ve çeviri işlemi yapan en genel olası afin dönüşümdür.
Önemli özelliklerden biri, 2 afin matrisini çarparsak:
| a b c dx | | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz | | g2 h2 i2 dz2 |
| 0 0 0 1 | | 0 0 0 1 |
her zaman formdan başka bir afin matrisi alırız :
| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
| 0 0 0 1 |
Matematikçiler bu mülkün kapanması olarak adlandırılır ve bir alan tanımlamak için gereklidir.
Bizim için, son dönüşümleri mutlu bir şekilde hesaplamak için matris çarpımları yapmaya devam edebileceğimiz anlamına gelir, bu nedenle kullanılmış matrisleri, daha önce hiç affedilmeyen daha genel 4D lineer dönüşümleri kullanmadan ilk etapta kullanırız.
Frustum projeksiyonu
Fakat bekleyin, her zaman yaptığımız önemli bir dönüşüm daha var: glFrustum
2x daha ileri bir nesneyi yapan, 2x daha küçük görünüyor.
İlk önce glOrtho
vs hakkında bazı sezgiler alın glFrustum
: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924
glOrtho
sadece çeviriler + ölçeklendirme ile yapılabilir, fakat glFrustum
matrislerle nasıl uygulayabiliriz ?
Farz et ki:
z = -1
uzunluk 2'nin karesidirz = -2
Keşke türden daha genel 4 vektöre izin verirsek:
(x, y, z, w)
ile w != 0
, ve buna ek olarak her tespit (x, y, z, w)
ile (x/w, y/w, z/w, 1)
, daha sonra matris ile bir kesik koni dönüşüm olacaktır:
| 1 0 0 0 | | x | | x | | x / -z |
| 0 1 0 0 | * | y | = | y | identified to | y / -z |
| 0 0 1 0 | | z | | z | | -1 |
| 0 0 -1 0 | | w | | -z | | 0 |
Atarsak z
ve w
sonunda, alırız:
x_proj = x / -z
y_proj = y / -z
tam olarak istediğimiz bu! Bazı değerler için örneğin:
z == -1
, tam olarak uçakta tahmin edeceğimiz x_proj == x
ve y_proj == y
.z == -2
öyleyse x_proj = x/2
: nesneler yarı boyuttadır.glFrustum
Dönüşümün nasıl bir afin formda olmadığını not edin: sadece rotasyonlar ve çevirilerle uygulanamaz.
Eklemenin w
ve onunla bölünmenin matematiksel "kandırıcılığı" homojen koordinatlar olarak adlandırılır.
Ayrıca bakınız: ilgili Yığın Taşması sorusu: https://stackoverflow.com/questions/2465116/understanding-opengl-matrices
Model, görünüm ve projeksiyon kavramlarını anlamak için bu videoya bakın .
4x4 matrisleri sadece bir 3B nesneyi çevirmek için kullanılmaz. Ama aynı zamanda çeşitli başka amaçlar için.
Bkz bu dünyada köşe 4D Matris olarak temsil edilir ve nasıl dönüşür anlamak için.