Bir matris neyi temsil eder?


19

Son zamanlarda OpenGL öğrenmeye başladım ve matrislerin ne olduğunu ve bilgisayar grafiklerindeki rollerini görselleştirmekte sorun yaşıyorum. Böyle bir 4x4 matrisinin şablonu göz önüne alındığında:

resim açıklamasını buraya girin

Bunun gibi her matrisin dünya uzayındaki bir tepe noktasının koordinatları olduğunu varsayabilirim. Birçoğu bir araya gelerek gölgeli bir nesne mi veriyor?

Ama neden a Xx, a Xyve bir var Xz? Farklı bir eksen olduğunu (yukarı, sola, ileri) okudum ama yine de öneminin başlarını veya kuyruklarını yapamıyorum.

Yanıtlar:


19

Bilgisayar grafiklerindeki matrisler, modeldeki her koordinat için verilen dönüşümlerdir. Her Matris, bir koordinata (3 boşlukta bir nokta) uygulanacak birden çok dönüşümün birleşimidir.

Bir dönüşüm oluşturmak üç dönüştürme türünden birine dayanır: Çevir, Döndür ve Ölçekle.

Çeviri matrisi şuna benzer:

Bir Çeviri Matrisi

Ve bir ölçek matrisi: Ölçek matrisi

Dönme matrisleri şöyle görünür:

resim açıklamasını buraya girin

Bu matrislerden herhangi birini birleştirmek için sadece onları çoğaltırsınız. Dönüşümü bir tepe noktasına uygulamak için sadece tepe noktasına çarpın (çeviri diyagramında görüldüğü gibi).


4
O yüzden matrisler noktaları temsil etmez. Şimdi utandım
Sad CRUD Developer

Çoğu zaman bir nesneye veya bir bakış açısına bir bütün olarak uygulanırlar (orto ile perspektif görünümlerinizi nasıl elde edersiniz)
Alex Shepard

3
@BDillan: Hayır, ama kesinlikle puan içerebilirler. Örneğin, bir ModelView matrisindeki (GL / sütun-majör) son sütun, başlangıç ​​noktasının nasıl çevrileceğini tanımlar. Ya da başka bir deyişle, gözün dünya uzayında nerede bulunduğunu tanımlar ve kelimenin tam anlamıyla tek başına bir nokta olarak kullanılabilir.
Andon

koordinatınız 3'lüdür. matris neden 3 çarpı 3 değil? Üç dönüşüm türünü tek bir matriste birleştirebildiğinizi ve hala yeterli alana sahip olduğunuzu varsayalım, o zaman sağ alt köşe ne yapıyor, her zaman 1 gibi görünüyor?
n611x007

Dördüncü satır / sütun, çeviriler için özel olarak oradadır. Matris matematiğin en güzel özelliklerinden biri, gerçekleştirmek istediğim tüm çevirileri ve rotasyonları tek bir matriste birleştirebilmemdir. Bu, çok, çok karmaşık dönüşüm kümelerinin (teorik olarak sonsuz) 1 matrise sıkıştırılabileceği anlamına gelir. Evet, son hücre 1 olarak kalır, ancak matematiğin geri kalanını yapmamıza izin verir.
Alex Shepard

10

Bilgisayar grafiklerinde dönüşümleri kodlamak için matrisler kullanırız .

Yalnızca çeviri, döndürme veya ölçekleme dönüşümleri içeren matrislerin yaygın olarak kullanılan bir yorumu vardır: matrisin sol üst 3x3'ünde yalnızca döndürme veya ölçek verileri, alt satırda veya sağ sütunda çeviri verileri bulunur. Bu bir genellik değildir , ancak bilgisayar grafiklerinde temsil edilen dönüşümlerin alt kümeleri için insanların bunu kullandığı yeterince sık doğrudur.

Benzer şekilde, matrisin değerleri ile matrisin temsil ettiği karşılık gelen koordinat çerçevesi arasında bir ilişki vardır (her zaman "dünya alanı" değildir, not etmeliyim). Sol üst 3x3 sütunlar (veya satırlar), koordinat çerçevesinin X, Y ve Z eksenlerini temsil eder.

Satırların eksenleri temsil edip etmediği veya sütunun gösterilip gösterilmediği, row vector * matrixveya ile çarpma kuralını kullanıp kullanmadığınıza bağlıdır matrix * column vector. Matris çarpımı gerçekleştirirken, iki matrisin iç boyutları aynı olmalıdır ve bu nedenle vektörleri satır matrisleri mi yoksa sütun matrisleri olarak mı temsil edeceğiniz bu seçimi etkiler (OpenGL ve geleneksel matematik sütun vektörlerini tercih etme eğilimindedir).

Doğrusal cebir hakkında iyi bir kitap edinmenizi veya en azından Matrix ve Quaternion SSS'ye ve DirectX ve OpenGL'deki matris düzenleri hakkındaki bu yazıyı incelemenizi öneririz .


hatta bazıları okuduğum ve anladığım tonlarca "iyi" lineer cebir kitabım var. Mesele şu ki, biraz da yardımcı olmuyor, onları anlamadım. Son tavsiyenizin yanlış varsayımı cevapladığı hissine sahibim.
n611x007

9

Matris nedir?

mSütunlar içeren bir matris ven satırlar öğelerle (veya koordinatlarla) bir vektör * tüketen ve möğelerle bir vektör üreten bir işlevi temsil eder n.

Bundan, ancak bir matris kare ise ve vektörün boyutluluğunun değişmeyeceğini gözlemleyebilirsiniz. Örneğin. 3B vektörü, 3B vektörü 2B'den dönüştürerek bir 3B vektör elde edersiniz.

* : Fizikte, vektörler genellikle hız veya ivme gibi şeyleri "hareket ettiren" güçleri veya diğer "etkileri" belirtmek için kullanılır. Ancak bir noktayı veya herhangi bir rasgele sayı dizisini temsil etmek için bir vektör kullanmanıza engel olan hiçbir şey yoktur (bazı kütüphaneler ve programlama dilleri "1D dizisi" anlamına gelmek için "vector" bile kullanır). Matrislerle kullanım için, matrisinizin öğeleri ne olursa olsun onları toplama, çıkarma ve çarpma yönteminiz olduğu sürece, herhangi bir şey vektörünüzün öğeleri (hatta dizeler veya renkler) olabilir. Bu nedenle "taşıyıcı" anlamına gelen isim vektörü - sizin için değerleri taşır veya tutar .

Bir matrisle çarpmak ne anlama geliyor?

Eğer bir matris bir fonksiyonsa, ne tür bir fonksiyon ? İşlev ne yapar? Bunun tarifi matrisin elemanları tarafından tanımlanır. Let çağrı giriş u, çıkış v, matris M(çarpma M*u=vsonra aynıdır f(u)=v) ve u(i)verir iinci elemanı u(2 eleman, örneğin, Y koordinat). Matris için M(i,j)satır anlamına geliri , sütunj .

v(1)Sonuçta ilk olan elemanın yapısı , matrisin ilk satırı ile açıklanır. u(1)kez M(1,1), artı u(2)kez M(1,2), ... artı u(i)kez M(1,i). Bir matris biraz basit bir programlama diline benzer, sadece girişlerin etrafında karışarak, bunları kendilerine ekleyerek vb. Çalışarak programlama işlevleri için iyidir. **

Her seferinde bir çıktı öğesi üzerinde çalıştığınızı hayal etmek yararlıdır, bu nedenle, aynı anda matrisin yalnızca bir satırını kullandığınızı düşünün. Sen yazmak uyatay. MAltındaki i. Satırı yazıyorsunuz . Yukarıdaki / aşağıdaki çiftlerin her birini çarpar ve aşağıdaki ürünleri yazarsınız, sonra ürünleri toplarsınız. Öğesinin her öğesini almak için her satır için tekrarlayın v. (Şimdi bir mby nmatrisinin neden bir mvektör üzerinde çalışması ve bir vektör üretmesi gerektiğini görüyorsunuz n.)

Bunu düşünmenin başka bir yolu - diyelim ki bir 3B'den 3B'ye dönüşüm yapıyoruz, bu yüzden 3x3 matrisi (veya sık sık çağrıldıkları gibi 3B dönüşümü , çünkü bu "fonksiyonun" 3B noktaları " sadece sayıları değiştirerek). Diyelim ki ilk satır[1 2 0] . Bu, x sonucunu elde etmek için, x girişinden 1, y girişinden 2 ve z girişinden 0 elde edeceğiniz anlamına gelir. Yani bu gerçekten bir tarif.

** : Bir matris bir programlama diliyse, Turing bile tamamlanmamıştır.

İki matrisin çarpılması ne anlama geliyor?

Her ikisi de uygun büyüklükte matrisler ise, A*B"önce Bo zaman geçerli olan bir işlev" anlamına gelir A. Boyut, girdi ve çıktı boyutunu belirlediğinden ve bir matris diğerinin çıktısını kullandığından, çarpma için boyut kısıtlamalarının neden var olduğunu görebilirsiniz. Çarpma neden fonksiyonları birleştirir? Olması gerektiğini fark etmek daha kolay. Eğer A*uaynıdır f(u)ve B*uolduğu gibi aynı g(u)sonra f(g(u))aynıdır f(B*u)ile aynı olan A*(B*u).

Benzer şekilde, aynı işlevin tekrarlanan uygulamaları güç olarak gösterilebilir, çünkü üç kez temsil eden A*A*Aişlevi uygulamak anlamına gelir A.

Matrisler nasıl faydalıdır?

new_x = 1*x+2*y+0*z(İlk satır [1 2 0] ise) dönüşümü ne işe yarar? Bu çok açık değil, ama bunu açıklamak için başka bir 2D matris alalım. Matris:

[ 0 1
  1 0 ]

Veya [0 1; 1 0]uygun Matlab gösterimini kullanarak. Bu matris ne yapıyor? Bir 2D vektörü şu şekilde dönüştürür: Sonuç x için girişin y'sinden 1'ini alın. Sonucun y değeri için, girişin x değerinden 1'ini alın. Girişin x ve y koordinatlarını değiştirdik - bu matris x = y çizgisi ile ilgili noktaları yansıtıyor . Bu biraz faydalı! Ek olarak, SW - NE çizgisi boyunca 1s olan tüm matrislerin yansıttığını göreceksiniz . Kimlik matrislerinin size neden girişi geri verdiğini de görebilirsiniz (çıktının x'i için, girdinin xini alın; çıkışın y'si için y'yi alın ...).

Şimdi sembollerin neden olduğunu görüyorsunuz. Xx, Yx- bunların nasıl girdi şey ifade X, Yçıkış girer vbx .

Matrisler başka nasıl faydalıdır?

Başka hangi dönüşümleri yapabilirsiniz? Bir kimlik matrisi alarak, ancak diyagonal boyunca 1'den farklı bir sayı ile yeniden boyutlandırabilirsiniz. Örneğin [2.5 0; 0 22.5], girişin her koordinatını 2,5 ile çarpar ve bu matrisi bir resimdeki her noktaya uygularsanız, resim 2,5 kadar büyük olacaktır. Bir satıra yalnızca bir 2,5 ( [2.5 0; 0 1]) koyarsanız, yalnızca x koordinatı çarpılır, böylece yalnızca x boyunca uzanırsınız.

Diğer matrisler, değişkenlik derecelerine sahip "eğriltme" gibi başka dönüşümler de verebilir. Şahsen, çarpıklık benim en sevdiğim şey çünkü matris çok basit görünüyor, ancak dönüşümün kendisi nadiren bir resmi değiştirmekten başka bir şey yapmıyor. Yararlı olan "döndürme" dir - bir noktayı nasıl döndürürsünüz? Başlangıç ​​noktasında saat yönünün tersine derece (x, y)döndürdükten sonra noktanın konumunu denemeyi deneyin theta. Yeni x ve y koordinatlarının her ikisinin de eski x ve y'nin tetanın bazı sinüsleri ve kosinüsleri ile çarpılmasından kaynaklandığını göreceksiniz. Bu işleve karşılık gelen sinüsleri ve kosinüsleri kullanarak kolayca bir döndürme matrisi yazabilmelisiniz.

Kare olmayan matrislerle, bir girdinin boyutunu da değiştirebilirsiniz. Bir 2D girişin 3D'ye dönüştürülmesi çok yararlı değildir, çünkü yeni koordinat içine koymak için bir şey "üretmek" zordur, ancak 3D 2B'ye çok faydalıdır. Diğer şeylerin yanı sıra, bu bilgisayarınızın proje bilir nasıl *** monitörünüzde çizmek için 2B görüntü içine 3D sahne.

Vektörler farklı şeyleri tutabildiğinden, bir karakter n karakterlerini bir seferde karıştırarak veya onları "çarparak" şifreleyen bir matrisi bile tanımlayabilirsiniz (çarpma / toplama işlevi bulmanız gerekir).

*** : Ne zaman proje , sen bir heykel gibi bir 3D nesne almak üzerine ışık tutmak ve nazik 2D gölge duvara düşer görmek.

Matrislerin sınırlamaları nelerdir?

Her fonksiyonu matrislerle yapabilir misiniz? Hayır. Grafiksel olarak düşünmek, bir matrisin yapamayacağı bir şey hayal etmek zordur (ancak var: örneğin bir "girdap" etkisi yapılamaz). Bununla birlikte, burada kolay bir örnek: Diyelim ki fonksiyon f, her bir kare ilef(u) size geri dönecek u şekildedir . Bunun için bir matris yazamayacağınızı göreceksiniz: Matrislerde, yalnızca koordinatları sabit bir sayı ile çarpan tarifleri tanımlamak için bir olanak vardır, güç gibi başka fantezi işlevler ifade edilemez.

**** : Bu yüzden doğrusal cebir olarak adlandırılır - güç fonksiyonu doğrusal değildir, çizildiğinde düz bir çizgi yapmaz.

4D matrislerde garip ekstra satırda

Şimdi, örnek 4'teki matris neden 4'e 4? Bu 4 boyutlu alan anlamına gelmiyor mu? 4D bilgisayarımız yok, neden? Bu aslında lineer operasyonlar hakkında önceki noktaya ilişkin matrislerle ilginç bir numara.

Matrislerle hangi fonksiyonların yapılamayacağına ilişkin olarak: Bir 2D noktasını 2 birim sağa hareket ettirmek için matris nedir (bu noktayı üretir (x+2, y)mi? Yine takılıp kalırız. 2B çalışma için, püf noktası aslında 2B alanda değil, 3B alanda, her şeyin yüksekliği (z koordinatı veya 3. eleman) her zaman 1'dir (2B evrenin nasıl olduğu gibi) 3B evrenin tabanı boyunca düz duran bir "plaka" - bu durumda üçüncü koordinat her zaman 0 olur) Sonra bu sihirli son koordinatı sabit olarak kullanabilirsiniz, çünkü her girdi için her zaman 1 olduğunu bilirsiniz.

Benzer şekilde, 3B noktaları taşımak için 4D koordinatlarına ihtiyacınız vardır. Bu yüzden gördüğünüz tüm 3B dönüşüm matrisleri [0 0 0 1]son satırda olacak - asla 4. boyutu değiştirmemelisiniz, yoksa sonuç 3B'de temsil etmek için çok karmaşık olacaktır!


öyleyse toplama için bir matris nasıl yapılır? diyelim ki bir satır Xx Yx Zx Tx... ve son satır aslında 0t 0t 0t 1tikame edildiği gibidir Xt Yt Zt Tt. Sizden yapmak (x+2, y), o zamandan beri size verecekti, değil mi? Bu hemen hemen x + 2'ye eşittir. Ah canım şimdi render'ınızı komik T değerleri ile karıştırın, değil mi? -grin- (uzun okuma, hala en iyi değer, thx)(x, y)1x 0y 0z 2t1*x + 0*y + 0*z + 2*1t=1
n611x007

2

Bu bir 4x4 sütun-ana matris ve görünüşe göre bir görünüm matrisi.

İlk 3 sütun temel vektörlerinizin yönünü tanımlar (siz çağırdığınız gibi yukarı, sol, ileri) ve son sütun göz noktasının çevirisini tanımlar. Bunları bir araya getirdiğinizde kameranızın yönünü tanımlayabilirsiniz ve daha da önemlisi noktaları "göz alanı", "görüş alanı" veya "kamera alanı" olarak bilinen bir koordinat alanına dönüştürmek için kullanabilirsiniz.

Bunların hepsi aynı koordinat alanı ile eşanlamlıdır. Ne yazık ki, bilgisayar grafikleri ile uğraşırken tüm eş anlamlıları öğrenmelisiniz, çünkü farklı kitaplar ve insanlar bunları farklı isimlerle arayacaktır. Çoğu koordinat boşluğunun birden çok adı vardır.

Bu arada, görünüm matrisinizdeki üç sütun genellikle diktir, yani birbirlerine dik açılar oluştururlar. Bu gerekli değildir, ancak geleneksel bir kamera oluştururken çok yaygın bir özelliktir.


1

TL; DR versiyonu:

[x y z]Her sıradaki ilk üç eleman , dönüştürülmüş bir koordinat sisteminin tek temelli bir vektörünü temsil eder . Son öğe wbir çeviri bileşenidir.

Uzun Versiyon

Bir tepe noktasına uygulandığında, köken hakkındaki tepe noktasını, örneğin 45 derece döndürecek bir matris istiyorsanız, matrisi, dönüştürülmüş eksenleri temsil eden üç vektörle dolduracaksınız:

  • Bir nokta iile xeksenin [1 0 0], ancak 45 derece döndürülmüş. Bu basitçe [i_x i_y i_z], burada i_xve i_yX eksenine göre 45 derecelik bir iç açı ile bir üçgen bacakları vardır: [cos(45) sin(45) 0].
  • jY ekseninde bir nokta [0 1 0], ama bu eksenden 45 derece döndürülmüş. Bir kağıda çizin ve saat yönünün tersine döndürüldüğünde bileşenlerin oluştuğunu göreceksiniz [-sin(45) cos(45) 0].
  • Bir nokta kile zeksenin. Bu örnekte, z(ekrana hizalanmış) xy düzleminde döndüğümüzden etkilenmez

Yani, üç yeni vektörünüz var: i, j, k. Bunu görselleştirmenin kolay yolu sadece X ve Y eksenlerini almak ve tüm çapraz düzenlemeyi döndürmektir.

Bunları bir matrise nasıl koyabiliriz?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Veya

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Herhangi bir köşeyi bu matrisle çarparsanız,

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

için v = [1 0 0], ve Θ = 90°bu olurv1 = [0 1 0]

Çeviri için dördüncü satır ve sütun ekliyoruz ve çeviri bileşenlerini son sütuna yerleştiriyoruz. Köşeye wgenellikle dördüncü bir bileşen ekliyoruz 1. Böylece, tepe noktasını matrisle çarptığımızda, w bileşeni son tepe noktasının giriş tepe noktasına eklenmesine neden olur, böylece tepe noktası taşınır veya çevrilir. Biz buna "homojen koordinatlar" diyoruz. (Bizim amacımız için, "homojen" sadece wher vektörde 4. bir bileşen olduğu anlamına gelir ve 3x3 yerine 4x4 matris kullanırız. Çoğunlukla işe yaramayan 4. satırı göndermekten kaçınmak için genellikle 4x3 matris kullanan gölgelendiriciler görürsünüz değerli bellek ve bant genişliği tüketen GPU'ya. 4. sıra perspektif projeksiyonu için gereklidir, ancak başka bir şey değildir.)

Bu yardımcı olur umarım.


2
Şu an üç yıl önce cevaplanmış bir soruyu cevapladığınızı anladığınız an ...
3Dave

: P Cevaplamadan önce her zaman soru tarihine bakın ...
HolyBlackCat
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.