OpenGL'deki klip alanının neden 4 boyutu var?


13

Bunu genel bir referans olarak kullanacağım, ancak ne kadar çok çevrimiçi tarayıcı dokümanı ve kitabı varsa, bu konuda o kadar az anlıyorum.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

Bu çevrimiçi kitapta , OpenGL için bir üçgen oluşturma konusunda ilk ve klasik merhaba dünyasının nasıl çizileceğine dair bir örnek var.

Üçgenin tepe yapısı yukarıdaki kodda belirtildiği gibi bildirilir.

Kitap, bununla ilgili diğer tüm kaynaklar gibi, Clip Space'in, ekranın neyin rasterleştirileceğine ve görüntüleneceğine karar vermek için kullanılan bir 4D yapısı olduğu noktasını vurgular.

Burada sorularım var:

  • 4D'de bir şey düşünemiyorum, bir insanın bunu yapabileceğini düşünmüyorum, bu Klip alanı için 4D nedir?
  • Okuduğum en insan tarafından okunabilir doktor, kırpma konsepti üzerinde bir soyutlama olan bir kamera hakkında konuşuyor ve bunun nedenini sorun, neden daha fazla olan bir kamera kavramını kullanmıyorsunuz? tanıdık 3D yapı? Bir kamera kavramıyla ilgili tek sorun, potansiyel müşteriyi başka bir şekilde tanımlamanız gerektiğidir ve bu nedenle temel olarak ne tür bir kamera olmasını istediğiniz hakkında başka bir ifade eklemeniz gerekir.
  • Bunu nasıl okumam gerekiyor 0.75f, 0.75f, 0.0f, 1.0f? Tüm aldığım hepsi float değerleri ve ilk 3 değerlerin anlamını almak, sonuncusu ne anlama geliyor?

4
Bölüm 4, dördüncü bileşenin tam olarak ne yaptığını açıklar. Aslında, çizik; Bölüm 1, rasterleştirme bölümündeki klips-NDC dönüşümünü yarıya kadar açıklamaktadır .
Nicol Bolas

2
@NicolBolas, ilk bölümde açıklamasını verir ve sonraki bölümler için herhangi bir referans vermez, ayrıca bazı c ++ kodlarını yorumlarken bir sonraki adımda ne olacağını açıklar gibi davranır ve sorun şu ki, her şeyi tam olarak açıklamazsa 1 bölüm, özellikle 1 bölümün içindekileri deşifre etmek için bu kavramlara ihtiyaç duyduğumda, 4 numaralı bölümde ilk sırada bilmem gerekeni koymak için çok mantıklı değil. Bunu şimdi okuyorum ve sadece 1 kez değil, şimdi cevabı daha fazla aramam gerektiğini biliyorum, çeşitli bölümlerden geçeceğim.
user827992

1
Hiçbir şeyin kodunu çözmenize gerek yoktur; bölüm 1'de yazmaktadır: W bileşeni diğer 3 bileşene ayrılmıştır. Bu giriş bölümünde de belirtilmiştir. Bölüm 4'e kadar ertelenen şey, OpenGL'nin bunu neden yaptığıdır. Bu, daha sonraya kadar kapalıdır, çünkü eldeki görevle alakasızdır.
Nicol Bolas

3
Elimizdeki konu için hala alakasız bilgi olacaktır (yani: bir üçgen oluşturma). Bunu merak ediyorsunuz, ancak bunun nasıl çalıştığını anlamanın yolunun neden olduğunu anlamanıza gerek yok . Bir şey öğrenirken, ilk adım ne olduğunu anlamaktır. Neler olduğunu anladıktan sonra , bunun neden böyle olduğu hakkında bir tartışma yapılabilir .
Nicol Bolas

1
Bu cevap yardımcı olabilir.
iammilind

Yanıtlar:


9

Sihirli terim, perspektifin bir faktör olduğu sistemlerde kullanılan "Homojen koordinatlar" dır. Wiki'ye genel bir bakış için bakın, ancak gerçekten anlamak için uzun bir çalışma süreci (ki ben bilmiyorum).


10

Okuduğunuz kitapların tanıtımını okuyun, şaşıracaksınız;)

Rasterizasyona Genel Bakış altında http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html

"W" değeri (ilk 3 değerin x, y ve z olduğu) temel olarak klip alanının boyutlarının ne olduğunu belirtir. Bu 1 skaler değer olduğundan, klip alanının 3 boyutunun hepsi eşittir (ve bu nedenle klip alanı bir küptür). Her tepe noktasının içinde bulunduğu kendi klip alanı vardır (ve temel olarak "sığması gerekir", aksi takdirde CLIPS: D), klip alanı olan 1 "dünya" yoktur (tüm klip boşlukları aynı " "Bence bu konuda sorun yaşıyorum; P).

Dolayısıyla, tepe noktanızda örneğin [1,1,1] koordinatı varsa, klip alanı 1 ise tepe noktası ekranın sağ üst köşesinde bulunur (tümü varsayılan olduğunda, yönlerin olup olmadığını bilmiyorum değiştirilebilir). Ancak tepe noktasının 2 klip alanı varsa, koordinat [1,1,1] diyelim ki, ekranın sağında 3 çeyrek, ekranın üstünde 3 çeyrek ve üçüncü boyut kendini tahmin edebilir.

Diyelim ki 5'lik bir klip alanı, küpün 5x5x5 olması yerine her boyutta bu boyut alanı içinde -5 ile 5 arasında bir yer anlamına gelir. Ama bunun nedeni muhtemelen basitçe söylemek gerekirse: tüm xy ve z koordinatları klip alanı boyutuna bölünür, bu nedenle temel olarak köşeleriniz buna maruz kalır:

x = x / w

y = y / w

z = z / w

Ve tüm bunları mümkün kılan da bu. Bunun var olma nedeninin kolay karşılaştırmalar olduğunu düşünüyorum. Koordinatlar klip alanı boyutuna bölünmüşse, 1'den büyük bir değere sahip 1 veya daha fazla bileşeni olan koordinat, klip alanının dışında bulunur. Klip alanınız 1024 diyelim, ancak koordinat [2000,3, -100] ise, x (2000) bileşeni klip alanının dışındadır (yalnızca -1024 ile 1024 arasında değişir).

bilgi işlem yapmak için, tüm yapmanız gereken şey (çok kabaca koymak .c): (x / w) <1 && (x / w)> - 1 sonra render etmek. Ayrıca, her köşedeki tüm klip alanlarının aynı boyutta olmasını (her boyutta -1'den 1'e kadar değişen her klip alanı küpünün) normalleştirme işleminden sonra gelenleri daha kolay hale getirdiğini ve tüm koordinatlarda o andan itibaren göründüğünü varsayalım 0 ile 1 arasında değişen şamandıralar (kırpılmış olanları dikkate almadan).


Soru, klip uzayının neden olduğu gibi olmasıydı , klip uzayının anlamı değil. Yani, W ile bölmenin anlamı nedir.
Nicol Bolas

2
3 mermi noktasının 3. sorusunu cevaplıyor olsa da =)
dammkewl

8

TL; DR 4D alanı değil, 3D artı hemen hemen her zaman 1 olan bir ölçekleme numarası. 1 ise, yoksayabilirsiniz ve ilk üç sayı x, y, z'dir. Değilse daha karmaşık hale gelir.

İşte basit bir açıklama. 3B köşeler yalnızca üç bileşene sahip olmalıdır

⌈x⌉ v = |y| ⌊z⌋

Bunları değiştirmek istiyorsak (örneğin döndürme, ölçekleme vb.) Bir matris kullanırız. Bunun en yaygın örneği, dünya koordinatlarını klip alanına dönüştüren Model-Görünüm-Projeksiyon (MVP) matrisidir. Bunun gibi:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Ancak bunun büyük bir kusuru var: çeviri yapamazsınız. Eğer [x,y,z]sıfır mise, sonuç ne olursa olsun her zaman sıfır olacaktır, bu yüzden çeviriyi içeren bir MVP'ye sahip olamayız. Açıkçası bunu istiyoruz. Çözüm, vektörlerimizin sonuna 1 eklemek ve matrisi 4x4'e genişletmektir:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Herhangi bir dikey MVP matrisine bakarsanız - örneğin glOrtho()- 4. sıra olduğunu görürsünüz 0 0 0 1. Bazen kapalı bile bırakılır.) Eğer matematik üzerinde çalışırsanız, bunun aynı olduğunu göreceksiniz.

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

4. bileşen çağrılır wve 1 olmak zorunda olmasa da , neredeyse her zaman ( yine de bir dönüşümden önce ; daha sonra genellikle tüm vektörü wtekrar 1'e bölerek yeniden homojenleştirilir ). Dönüşüm matrislerinin çeviriyi içermesine izin vermek bir tür hack'tir.

Düzenle

Orijinal motivasyonun 3D koordinatlarla imkansız olan perspektif projeksiyonları için olduğuna inanıyorum . Yalnızca 4D vektörleri ile yapabileceğiniz başka dönüşümler de vardır, ancak çeviri en kolay anlaşılır yöntemdir.


2
Downvotes açıklayın.
Timmmm

+1, bilgilerin doğru olduğunu varsayarak, bu iyi bir açıklama ve bana yardımcı oldu. teşekkürler
Luke

1

Görmem için bir neden daha var ve bu daha önceki cevaplarda belirtilmedi.

Çeviri matrisleri 4x4'tür, böylece nesneyi "dünya" çevresine de çevirebilirsiniz. Çünkü 3x3'lük bir matrisle bir 3d koordinatı döndürebilir ve ölçeklendirebilirsiniz, ancak 3B koordinatını sadece 4x4 matrisle çevirebilirsiniz, buradan 3d koordinatları 4d vektörde ifade etme ihtiyacı.


sadece bu tür tanımlamalar altında bir 4d vektörüne "ihtiyaç duyarsınız". 4x4'lük bir matris sadece herkesin varsaymayı ve başkalarına hak talebinde bulunmayı sever gibi eklemeyi amaçlamaz. tüm istediğiniz dönüşten sonra (3B noktaya) çeviri eklemek olsaydı, sadece 4x3'lük bir matris tanımlarsınız. eğer peşinde olduğunuz bu kadar ise çok daha verimlidir. Kendinizi diğer nedenlerden oluşan bir paket için yapılan kurallarla sınırlamanız gerekmez, çünkü daha temiz görünür. lol
birikintisi
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.