Neden şeyleri 3 boyutlu olarak dönüştürmek için 4x4 matrisleri kullanıyoruz?


36

Bir vektörü 10 birim X yönüne çevirmek için neden bir matris kullanmak zorundayız?

görüntü tanımını buraya girin

[0] [0] matına sadece 10 ekleyebiliriz ve aynı sonucu aldık.

Yanıtlar:


28

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).


evet, matrisin dönme için faydalı olduğunu biliyorum. ama her ders bana böyle basit bir hesaplama yapmak için matris kullanarak rehberlik ediyor: D
ngoaho91

1
Rotasyonun "sadece" bir matrisle yapılabileceğini söylemek yanlış olur, kafamın tepesinden
çıkmaz

17
Bundan da öte, hem 4x4 matris olarak hem de döndürme ve çevirme yaptıktan sonra, her bir köşeyi farklı yapılar kullanarak binlerce farklı dönüştürmeyle dönüştürmeye gerek kalmadan, bunları yalnızca çarparak tek bir matristeki birleşik dönüşüm elde edebilirsiniz. Bir 4x4 matrisin tek bir çeviri veya tek bir döndürme için fazla olması gerçeği, genellikle bir köşeyi yalnızca tek bir çevirmeyle veya tek bir döndürmeyle dönüştürmemenizden daha ağır basar.
Chris, Monica

1
@ concept3d Evet, biliyorum, cevap iyi. Bununla birlikte, bir matris kullanmanın tek biçimli yolundan kazanılan daha da büyük avantaj, sadece tek biçimlilik değil, aynı zamanda bütün bir dönüşüm zincirinin tek bir işlemde gösterilmesidir. Bu ima edilmiş olsa da, açıkça belirtecek kadar net ve önemli buldum. Fakat cevap yine de iyiydi, bir eleştiri değildi.
Chris, Monica

1
Evet, trig, dönme matrisini hesaplar, ancak vektör matematiği, trig-infüzyon veri setini kullanarak noktaları "döndürür". Trigonometri derken, basit şeyler üretmek için doğrudan bir matris aracılığıyla değil, onu kullanarak ima ediyordum.
MickLH

6

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. .


5

"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.


2
Bu seçilen cevap olmalıydı.
Mühendis

4

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.


2
Ayrıntılı hazırlanmalısın. Özlü bir açıklama sadece wikipedia 'dan bağlantıdan daha iyidir.
Seth Battin

3

Ç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 aformdadı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, varaç kasamızın bin vektörünü matris ile çevirip Tdaha 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 RTaracın kendisine göre olan matris ile çarpıyoruz.

Bu doğal olarak bir yığın matrisin korunmasına yol açar :

  • şasi matrisini hesaplar
  • lastik matrisi ile çarpın (itin)
  • lastik matrisini çıkarın (pop)
  • tekerlek matrisini sürerek çarpın (itin)
  • ...

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:

Görüntü kaynağı .

Her yatay çizginin (sabit y) nasıl çevrileceğini not edin .

Satırı y = 1yeni 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: glFrustum2x daha ileri bir nesneyi yapan, 2x daha küçük görünüyor.

İlk önce glOrthovs hakkında bazı sezgiler alın glFrustum: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrthosadece çeviriler + ölçeklendirme ile yapılabilir, fakat glFrustummatrislerle nasıl uygulayabiliriz ?

Farz et ki:

  • gözümüz başlangıç ​​noktasında, -z
  • ekran (düzlemin yakınında), z = -1uzunluk 2'nin karesidir
  • frustum uzak uçağı z = -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 zve wsonunda, alırız:

  • x_proj = x / -z
  • y_proj = y / -z

tam olarak istediğimiz bu! Bazı değerler için örneğin:

  • eğer z == -1, tam olarak uçakta tahmin edeceğimiz x_proj == xve y_proj == y.
  • eğer z == -2öyleyse x_proj = x/2: nesneler yarı boyuttadır.

glFrustumDönüşümün nasıl bir afin formda olmadığını not edin: sadece rotasyonlar ve çevirilerle uygulanamaz.

Eklemenin wve 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


@ Sahipler, lütfen açıkla ki öğrenip geliştireyim.
Ciro Santilli 事件 改造 中心 at 六四 事件

Şahsen bunun sadece uzun ve başıboş olduğunu düşünüyorum, orijinal soruyu ele alan kısım yeni bir şey değil (diğer cevaplar tarafından iyi karşılanmayan) ve geri kalanının alakasız olması, üzerinden geçmeyi gerçekten zorlaştırıyor.
Josh

@JoshPetrie Geri bildiriminiz için teşekkür ederiz! Zaten anlamayanların, benim için daha iyi örneklendirilebilecek ve görsel olduğu için cevabımdan anlama olasılıkları olacağını düşünüyorum. Tamamen alakasız olan belirli hatalar veya noktalar bulursanız, onları düzeltmek için düzeltin. Şerefe.
Ciro Santilli,

Dediğim gibi, cevabın çoğunun alakasız olduğunu düşünüyorum. Soru “Neden 4x4 matris kullanıyor, neden ekleyemiyoruz?” Diye soruyor. Bunun cevabı, "evet, ekleyebilirsin, ama bir matris de çevirmene / döndürmenize / ölçeklemenize izin verir, ama matris matematiğinin nasıl çalıştığından dolayı 3x3 çeviriyi kodlayamaz, fakat 4x4 bir kutu." Bunu, metnin bu duvarında tamamen gizlerseniz, bulmak çok zordur. Geri kalanı, sorulmamış bir matris matematiği için bir primer ve muhtemelen başka bir sorunun cevabı olarak iyi olsa da, bu soruya uygun olduğunu sanmıyorum .
Josh

1
Detaylara gösterilen ilgiyi takdir ediyorum. Önceki kullanıcının endişesini gidermek için, cevabın "Çeviriler 3D matrislerle gösterilemez" den başlamak üzere yeniden düzenlenmesi gerekir. Bu, sorulan derhal soruyu yanıtlar ve OP, sunulan iyi yazılmış ve hevesli detaylara devam edebilir; Bu daha ince detaylar burada ilgilendiğim şeydir, bu yüzden önyargılı olabilirim, ama bu kesinlikle "başıboş" değil.
dskinner

1

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.


1
Bu aslında OP sorusuna cevap vermiyor.
concept3d

Düzenlenen. Kulağa iyi geliyor?
cegprakash
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.