Grafik kartı bir vektörün dördüncü öğesiyle son konum olarak ne yapar?


25

Gönderen bu soruya o matris çarpma ile konumunu değiştirmek daha kolaydır olduğu gibi, dört unsur pozisyon vektörü isteyeyim görünür.

Kendi başına bu, dördüncü unsurun bir 3B noktanın temsili olarak değerlendirilirken basitçe göz ardı edilmesi gerektiği anlamına gelecektir (dönüşüm olmadığını varsayarak); eleman bir değil, oluşturulmadı - neden?

Dördüncü elemanın, rasterizatöre girdikten sonra ne önemi var?

EDIT : İnceleme üzerine bu soru biraz kötü ifadeli; ikinci paragrafın şunu söylemesi daha doğru olacaktır: "dördüncü elemanın değeri belirli bir aralıkta değilse," doğru "/" beklendiği gibi "gösterilmez."


koordinatları (x, y, z, 0.5) olan bir vector4, vector4'ün koordinatlarla (2x, 2y, 2z, 1) aynı sonuçlarını vermez mi?
FxIII

@ FxIII, tam olarak çoğaltmayı başaramadım, ancak orijinal deneyimde yapılan yanlış bir battaniye ifadesi olarak haklıydınız, biraz daha deney yaptıktan sonra.
sebf

Yanıtlar:


23

Dördüncü bileşen, perspektif projeksiyonunu takip etmek için bir püf noktasıdır. Bir perspektif projeksiyonu yaptığınızda, z: x '= x / z, y' = y / z ile bölmek istersiniz, ancak bu, x vektöründe çalışan 3x3'lük bir matris tarafından uygulanabilecek bir işlem değildir, y, z. Bunu yapmak için standart hale gelen hile, dördüncü bir koordinat eklemek, w ve x, y, z'nin tüm dönüşümler uygulandıktan ve rasterleştirmeden önce her zaman w'ye bölüneceğini beyan etmektir.

Perspektif projeksiyonu daha sonra z'yi w'ye hareket ettiren bir matris elde edilerek gerçekleştirilir; Ama aynı zamanda, bir bölme yapmak istemiyorsanız, w = 1.0 bırakma esnekliği sağlar; Mesela sadece paralel bir projeksiyon veya bir rotasyon veya neyse onu istiyorsanız.

Konumları w = 1, yönleri w = 0 olarak kodlama ve bir matrisin dördüncü satırını / sütununu çeviri için kullanma yeteneği güzel bir yan faydadır, ancak w eklemenin temel nedeni bu değildir. Biri, görünürde herhangi bir görüş olmadan çeviri yapmak için afin dönüşümlerini (3x3 matris artı 3 bileşenli bir çeviri vektörü) kullanabilir. (Kişi neyin pozisyonu, neyin yönü olduğunu takip etmek ve her birine farklı dönüşüm fonksiyonlarını uygulamak zorunda kalacak; bu biraz rahatsız edici, ama gerçekten büyük bir sorun değil.)

(BTW, matematiksel olarak w ile güçlendirilmiş vektörler homojen koordinatlar olarak bilinir ve yansıtıcı alan adı verilen bir yerde yaşarlar . Ancak, 3D grafikleri yapmak için daha yüksek matematiği anlamanıza gerek yoktur.)


Bir kez daha bu terimlerdeki vektörler ve noktalar hakkında konuşmak biraz yanlıştır, çünkü noktalar ve vektörler arasında bir izomorfizm vardır (orijini o noktaya taşıyan nokta ve vektör aynı varlıktır). Noktalar / vektörler (w! = 0) ve (projektif) yönlerden (w = 0) bahsetmek daha doğru olurdu. Yine de "vektör" teriminin kötüye kullanılması, 3d kütüphaneler dilinde oldukça konsolide bir standarttır.
FxIII

@ FxIII: Düzeltildi. "Vektör" ü standart matematik anlamında ve aynı yazıda "yön" ile eşanlamlı olarak kullanmak kafa karıştırıcıydı.
Nicol Bolas

@ FxIII ve Nicol Bolas: Aynı fikirde değilim. Gerçekten vektörleri w = 0 olarak kodlarsınız - sadece bir yönü temsil eden her iki vektör ve uzunluğun önemli olduğu gerçek vektörler. Örneğin, nesnenin matrisini kullanarak bir nesnenin açısal hız vektörünü (yön = dönüş ekseni, uzunluk = hız) yerel alan ve dünya alanı arasında dönüştürebilirsiniz. Açısal hızın nesnenin çevirisine eklenmesi için istemezsiniz; sadece döndürülmesini istiyorsun. Yani, w = 0 olarak ayarladınız.
Nathan Reed

@NathanReed Yazımın noktayı netleştirmeye yardımcı olacağını umuyorum, her neyse, noktamın büyük bir kısmı tanımların ve vektörün kötüye kullanılması artı standart 3D kütüphane terminolojisi üzerindeki doğrusal cebirin önceliği üzerinedir. Elbette her tanım ve öncelikli iddia olduğu gibi her ikisi de tartışılabilir
FxIII

@ Nathan, şimdi dördüncü öğenin amacını ve içerdiği bilgilerin rasterleştirici tarafından nasıl kullanıldığını açıkça görebiliyorum. Çok teşekkürler!
sebf

10

Natan'ın uygun yorumuna cevap vermeye çalışarak, standart Öklid Uzayında 3B vektörleri temsil etmek için Affin Space'de vektörler kullandığınızda gerçekte neler olduğunu anlamak için faydalı olabilecek bazı düşünceler yaptım.

İlk önce koordinatlara sahip olanı vektör olarak çağıracağım , yani bir nokta ve bir vektör aynı varlıktır; bir vektörü iki nokta farkı olarak görebilirsiniz: V = B - A ; V B A içinde hareket eder , çünkü A + V = A + B - A = B . A = 0 (orijinli) koyun ; V = B - 0 = B olsun : B noktası ve 0 hareket eden vektöriçin B aynı şeydir.

"Vektör" diyeceğim - 3B kitaplıkların çoğunda kullanılan anlamda - afinasyon uzayının bir vektörü w = 0 olduğunda.

Matris, lineer bir işlevi kompakt / zarif / verimli bir biçimde temsil etmenize izin verdikleri için kullanılır, ancak doğrusal işlevler, kökü dönüştürülemeyen büyük dezavantajlara sahiptir: F ( 0 ) = 0 , F doğrusal olmak isterse (F Diğer şeyler arasında F (λ X ) = λF ( X ) ve F ( A + B ) = F ( A ) + F ( B ))

Bu, 0 vektörünü asla hareket ettirmeyeceğinizden, çeviri yapan bir matris oluşturamayacağınız anlamına gelir . İşte Afin Uzay oyununa geliyor . Afinik alan öklid uzayına bir boyut ekler, böylece traslantyonlar ölçeklendirme ve rotasyonlarla yapılabilir.

Afin Uzayı, Afin ve Öklid vektörleri arasında bir denklik ilişkisi kurabileceğiniz anlamında yansıtıcı bir alandır, böylece onları (kafaları ve vektörlerle yaptığımız gibi) birbirine karıştırabilirsiniz. Aynı yönde kökene yansıyan tüm afin vektörleri aynı öklid vektörü olarak görülebilir.

Bu, koordinatlarda aynı oranlara sahip tüm vektörlerin eşdeğer sayılabileceği anlamına gelir:

Matematiksel olarak:

denklik

yani her afin vektörü w = 1 olan bir canon versiyonuna indirgenebilir (her eşdeğer vektör arasından en çok sevdiğimiz birini seçeriz).

Görsel olarak (2D öklid - 3D affine):

görsel denklik

dolayısıyla “projektif” alanın anlamı ; Burada, öklid uzayının 2B (mavi bölge) olduğunu fark etmelisiniz.

W = 0 (hiper) düzleminde yer alan kanonik sürümlerine (kolaylıkla) yerleştirilemeyen belirli afine vektörleri kümesi vardır.

Görsel olarak gösterebiliriz:

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

> 0 sonra Öklid uzaya yansıtılan vektör sonsuzun ama bir özellikle sonsuzun gider - ne görmek (olmalı) iken w olmasıdır Yön .

Şimdi, projektif uzayına iki vektör eklemenin, toplam vektörü öklid uzayında yansıtılan bir vektör olarak gördüğünüzde sorunlara yol açabileceği açıktır; öklid düzlemi (hiper) düzlemi.

Bu yüzden sadece "noktaları" nı "vektörler" olarak toplayabilirsiniz çünkü bir "vektör", "noktanın" w koordinatını değiştirmeyecektir, bu sadece "puanlar" burada w = 1:

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

Gördüğünüz gibi yeşil nokta, camgöbeği "noktayı" temsil eden iki afin vektörünün eklenmesiyle elde edilen ve V "vektörünü , ancak her afin vektörüne V'yi canon tarafından farklı bir biçimde uygularsanız , elde edersiniz. yanlış sonuç (kırmızı "" nokta "").

Affine Space'in Öklid Uzayları üzerindeki işlemi tanımlamak için şeffaf bir şekilde kullanılamayacağını ve "vektör" teriminin yanlış kullanılmasının hesaplama toplamlarının (katı) kısıtı altında bir anlamı olduğunu görüyorsunuz. yalnızca yansıtıcı vektörler üzerindeki .

Bununla birlikte, GPU’nun ne yaptığınızı gerçekten bilmiyorsanız Vector4’ün w = 0 veya w = 1 olması gerektiğini varsaydığını kabul etmek mantıklıdır .


Dördüncü bileşenin ilişkisinin nasıl kullanıldığı ve neden gerekli olduğu anlayışına katkıda bulunduğundan, bu soruya bir cevap seçmek çok zordu. Öklid ve afin uzamı açıklamanız çok faydalıdır, kesinlikle şu anki detay seviyesine sahip olduğum gibi anlamadım. Çok teşekkür ederim!
sebf

Projektif alanın iyi bir açıklaması için (ve diyagramlar!). Bununla birlikte, affine mekan ve projektif mekan aynı şey değildir (bkz. Wikipedia'da afine mekan tanımı ). Belki bunu söylemenin iyi bir yolu şudur: projektif 3 boşluk ve 3 boşluk bırakma her ikisi de R ^ 'e gömülebilir, ancak yerleştirmeler tamamen uyumlu değildir. Afin uzaydan w = 0 olarak kodlama vektörleri mümkün ve faydalıdır, ancak projektif bakış açısından anlamlı değildir. Aynı şekilde, yansıtıcı yönler (sonsuzluk noktaları), afin bakış açısından anlamlı değildir.
Nathan Reed

1

(X, y, z, w) gibi bir vektör varsayalım. Bu vektör 4 bileşen x (uzayda x koordinatı), y (uzayda y koordinatı), z (uzayda z koordinatı) ve ilginç ve gizemli w bileşenine sahiptir. Aslında çoğu 3d oyun 4d uzayda çalışır. Aynı zamanda 4d homojen uzayı da denir. Bunun bazı açık yararları var ->

1> Çeviri ve rotasyon matrislerini birebir birleştirmemize yardımcı olur. Bunun ne anlama geldiğini düşünüyor olabiliriz, sadece çeviri ve rotasyon matrisini çoğaltabiliriz, hepsi bu, fakat daha fazlası yok. Tüm vektörlerimizdeki w bileşeni sonra 3B vektörü (xyz) ne olursa olsun, çeviri ve döndürme matrisine çarptığımızda, bilinçsizce değerleri x, y veya z ile ölçeklendiririz (matris çarpımı böyle çalışır) ve bu muhtemelen ölçekleme nedeniyle pozisyon matrisini (birleştirilmiş matrisin çeviri kısmı) bozmuştur. Bu sorunu düzeltmek için 4. bileşen vektör tanıtılmıştır ve vektörün (w) bu bileşeni vakaların% 99'unda 1.0 değerini alacaktır. Bu 4. bileşen bize izin verir ölçeklenmemiş konum değerlerine sahip olmak için (çeviri).

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

ve sonra basit ama güçlü bir matrisimiz var. :)

2> Perspektif projeksiyon aşamasında z değerini w bileşenine kopyalarız ve x, y'yi onunla böleriz. Bu şekilde nesneler ekrandan uzaklaştıkça kısalır.


Teşekkür ederim! Dördüncü bileşeni, bir varlığın 3B uzayda herhangi bir şekilde gerçekten yararlı bir temsilinde kullanmanın gerekliliğini giderek daha fazla görüyorum.
sebf
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.