Standart görüş hacminin amacı nedir?


15

Şu anda OpenGL öğreniyorum ve bu soruya cevap bulamadım.

Yansıtma matrisi görüş alanına uygulandıktan sonra görüş alanı "normalleştirilir", böylece tüm noktalar [-1, 1] aralığında kalır. Buna genellikle "kanonik görüntü hacmi" veya "normalleştirilmiş cihaz koordinatları" denir.

Bana bunun nasıl olduğunu anlatan çok fazla kaynak buldum, ancak bunun neden olduğu hakkında hiçbir şey görmedim .

Bu adımın amacı nedir?

Yanıtlar:


7

En önemlisi, puanlarınızı (köşeleri) 3D dünya uzayından 2D ekran uzayına dönüştürmesidir.

Bu, tepe noktasının bu matris ile çarpılmasından sonra X ve Y tellerinin ekranda ([-1, 1] arasında) konumlandırıldığı ve Z'nin derinlik olduğu anlamına gelir. Z, derinlik tamponu için kullanılır ve düzlemin yakınındaki kameralarınızdan tepe noktasının (veya parçanın) ne kadar uzak olduğunu tanımlar.

Yansıtma, yakın düzlemden daha yakın olan köşelerin ekranın ortasından daha uzak olduğu anlamına gelir -> kameraya yakın olan üçgen daha uzak olandan daha büyük görünür. Ve bu sizin görüş alanınıza dayanıyor - bunu bazı createProjectionMatrix işlevine veya createFrustum'a giriyorsunuz. Kameranızın frustumunu ve içindeki köşeleri birim küpü içinde keser ve ölçeklendirir. 1'den büyük ve -1'den küçük değerler görüntülenmez.

Ayrıca piksel en boy oranını korur, böylece piksel sqaure olabilir. Bu basit. Sadece kamera frustumunu şu şekilde keser: daha geniş ekran -> daha dikey kesme ve tersi.

Basit cevap:
Kameranızın frustumunu tanımlar ve şunları yapmak için iyidir:

  • size yakın olan nesnelerin sizden uzak olan nesnelerden daha büyük görünmesini sağlayın.
  • piksel en boy oranını koru - Herkes kare pikseli seviyor mu? :)

Projeksiyon matrisinin ne yaptığını sorduğu hiçbir parça görmüyorum. Normalize edilmiş cihaz koordinatlarının ne için olduğunu merak ediyor gibi görünüyor.
Chris, Reinstate Monica'ya

İzdüşüm matrisi kamera kesik konisi tanımlar. Ancak bu, kanonik görüntüleme hacmi olarak [-1,1] 'e sahip olmanın nedenini açıklamaz. Bunun yerine neden [-100,100] yok?
bobobobo

1
1, 100'den "daha yaygın sayı" olduğundan: D (0 daha da yaygındır, ancak 0x0x0 küpü çok ilginç değildir ...)
Ivan Kuckir

5

Bu cevap çok uzun bir süre sonra, ama bunu Google'da bulduğumdan beri belki bu hala birine yardımcı olacak. Sadece JasonD ve Notabene'nin ne dediğini açıklığa kavuşturmak istiyorum: Kırpma hesaplamaları yapmak çok daha kolay (ne görmeniz gerektiğini ve neye bakmamanız gerektiğini anlamanız gerekir, vb.) .). Görünüşünüzün kenarlarındaki düzlemlerin kesişip kesişmediğini kontrol etmek yerine, her şeyin x, y, z ile xMax, xMin, yMax, vb. , çünkü sadece bir küpünüz var. Gösteren bir şeyin sadece bir kısmına sahip olmak istiyorsanız biraz daha karmaşıktır, ancak matematik bir ünite küpüyle bir frustumdan daha iyidir.

Diğer cevaplarda yanıltıcı bulduğum birkaç şey:

- Yanları görünüm frustumundan kesmiyorsunuz, homojen matris dönüşümlerini kullanarak bir küp haline getiriyorsunuz.

-Bu adımla bir 2D ekrana dönüştürmüyoruz. Bu adımın yapılması gerekli değildir. Teorik olarak, tüm çalışmamızı ilk önce bir sezgiye dönüştürmeden yapabiliriz, bu da daha sezgisel ama daha zor matematik olurdu - ancak grafikler, ortalama oyun / her ne olursa olsun saniyede bir LOT hesaplama olduğu için grafiklerin çok hızlı bir şekilde hesaplanmasıyla ilgilidir.

Daha fazla detay: Bu, mutlaka dönüştürdüğümüz bir birim küpü değildir, maksimum-min hesaplamalarımızın çalışması için sadece dikdörtgen bir kutu olması gerekir. Aslında sınıfta kameranın z eksenine baktığı, z 0'dan 1'e, x -1'den 1'e ve y -1'den 1'e gittiği bir kutu kullandık. Genel olarak matematik 1, 0, ve -1, hesaplamaları kolaylaştırmak için iyi sayılardır, bu yüzden -100'den 100'e veya başka bir şeye gitmiyoruz.

TLDR: Kırpmayı kolaylaştırır.

Düzenleme: bobobobo bunun özü var. Her şey genellikle üçgenlerdir: D.

Kaynak: Üniversite grafik dersi almak


İlginç olsa da, puanlarınız kısmen doğru gibi görünüyor. Homojen bir matris kullanmıyorsunuz, sadece klips alanında, homojen alanda noktalar tanımlanıyor. 2) true, klibi boşluk ponts henüz ekrana yansıtılmamıştır. Perspektif bölünmesinden sonra olur, ancak bunun mutlaka klip alanından kartezyen alana geri döndüğünüzde gerçekleştiğini unutmayın. 3) evet ve hayır. Nokta koordinatlarını NDC alanına dönüştürmek hala bir şekilde gereklidir. Gerekli olmayan, GPU'ya özgü klip alanıdır. ...
user18490

... Gerekli olmayan klip alanı aşaması, birim küpüne yeniden eşleme değil. Son varsayımınız da doğru değil. -1'den 1'e yeniden eşleştiriyorsunuz çünkü NDC uzayından tarama alanına (görünüm alanı dönüşümü) geçmek daha kolay. NDC alanı [0,1] aralığında olmanız daha kolaydır, bu da bazı uygulamalar için geçerlidir. Sonunda hepsi matematik, bu yüzden diğer sözleşmeler kullanılabilir emin. daha fazla ayrıntı için iyi scratchapixel web sitesine bakın.
user18490


1

Bunun nedeni, OpenGL'nin görüntünün nasıl görüntüleneceği (varsayım oranı veya çözünürlük, donanım ayrıntıları, vb.) Hakkında varsayımlar yapamayacağına inanıyorum. İşletim sisteminin veya sürücünün veya doğru çözünürlük / boyuta ölçeklenen her şeyin bir ara form haline getirir ve görüntüler.


Donanım ayrıntıları hakkında konuştuğunuzda doğru değilsiniz. Olmayan vardır. Ayrıca cpu üzerinde kendi rastarizator yazıyorsanız (neden yapmalı? Bu şeylerin nasıl çalıştığını öğrenmek için :)) gpu ile aynı matrisleri kullanıyorsunuz. Hala oy vermek için ayrıcalıklara sahip olmadığım için şanslısın :)
Notabene

En / boy oranını bilmek gerekmez mi? Anladığım kadarıyla, X ve Y için ölçeklendirme faktörlerini saklar, böylece görüntü daha sonra doğru en boy oranına sahip olur.
breadjesus

3
Eğer yanılıyorsam beni düzeltin, ama siz puan kazandıktan sonra bahsediyor ve bu yüzden 2D konuşuyoruz. Bu durumda, OpenGL bu görüntüyü ekranda nereye koyduğunuzu veya nasıl görüntüleneceğini bilmiyor. Daha sonra ölçeklendirilmesi ve doğru şekilde yerleştirilmesi kolay bir görüntü oluşturur, ancak bunu sizin için yapmaz. Donanım detaylarının bunun için kötü bir isim olduğunu kabul ediyorum, sadece yukarıda bahsetmiştim. Ayrıca, en boy oranına sahip bir projeksiyon matrisi belirtebilirsiniz, ancak bu oranın monitörünüzle aynı olması gerekmez.
Chewy Gumball

3
Bu konuşmadan gerçekten keyif aldığımı söylemeliyim. Haklısın. Daha derine inelim. ProjMat tarafından çoğaltma köşelerinden sonra görüntü yok. Sonuç sadece 2B nokta derinliği ile ayarlanır. Rastarizasyon başlar ve görüntüler yaratır. (cpu üzerinde üçgenler verts arasında çizgiler çizip doldurursa (ve ne olursa olsun gölgelerse) ... gpu'da piksel / fragman gölgelendiriciden hemen önce gerçekleştirilir). Ve en boy oranı, "ölçeklendirilmesi" gereken noktaları 1'den büyük veya -1'den küçük değerlere koyar ve görüntülenmez.
Notabene

2
Ahhh! Sorunu burada görüyorum. "Bu genellikle" kanonik görüntü hacmi "veya" normalleştirilmiş cihaz koordinatları "olarak adlandırılır." Normalleştirilmiş cihaz koordinatlarını soruyormuş gibi cevap veriyordum, ama aslında hiç de bu soruları sormuyordu. Aslında bunlar tamamen farklı iki şey ve bu yüzden burada çelişiyoruz. Belki de bunun açıklığa kavuşturulması gerekir, böylece insanlar benim yaptığım aynı hatayı yapmazlar.
Chewy Gumball

1

Bir cevabın zaten kabul edildiğini not ediyorum, ancak kırpma için görünüm frustumunun bir ünite küpüne dönüştürülmesi genellikle yararlıdır.


Doğru, bu konuda daha açık olmak için cevabımı çok az düzenledim.
Notabene

Bu arada birim küp yan 1 küpüdür. Bu yüzden isim uygun değildir. Bunun yerine standart görüntüleme hacmi olarak adlandırılmalıdır.
user18490

1

Ben de bunu merak ettim. Dikkate alınması gereken birkaç şey var.

İlk olarak, evet, dünyadaki her şey orijin etrafında merkezlenmiş o birim küpüne [-1,1] dönüştürülür. Bu birim küpünde bir şey yoksa, görüntülenmez.

Bununla ilgili güzel olan şey şu ki, üçgenleri kolayca kolayca kaldırabilirsiniz. (Bir üçgenin tüm 3 köşesi varsa x > 1veya x < -1bu üçgenin itlaf edilmesi durumunda).


0

Scratchapixel'da perspektif projeksiyon matrisi dersini kontrol etmenizi tavsiye ederim

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

Görünüm frustum alanını neden bir ünite küpüne çarpıtmanın açık olduğunu açıkça göstermektedir. Neden? Temelde tuval üzerine 3D noktaları yansıtma süreci, onları dönüştürmek için dahil olan NDC alanıdır, bu da ekrandaki noktaların [-1,1] aralığında yeniden eşleştirildiği bir alandır (ekranın kare olduğu varsayılarak). Şimdi Z koordinatını da [0,1] (veya bazen [-1,1]) aralığına yeniden eşleştiriyoruz, bu nedenle sonunda bir küp ile sonuçlanacaksınız. Gerçek şu ki, noktalar bir küp içinde bulunduğunda, bunları görüntülemek, görünüm hayal kırıklığında (garip bir alan, kesilmiş bir piramittir) tanımlandıklarından daha kolaydır. Başka bir neden de, CG'de hayal edebileceğiniz her türlü projektif dönüşümü aynı alana (birim küp şey) getirmesidir. Dolayısıyla, örneğin bir perspektif veya ortografik projeksiyon kullansanız da,

Belki neden çok fazla odaklanmış olursun. Birim küp gerçekten sadece köşeleri bir ekrana yansıtmak ve daha sonra alanı raster için koordinatlarını yeniden eklemek için kullanılan veya kullanılan matematik sürecinin sonucudur.

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.