Burada bazı karışıklıklar var.
OpenGL, nesne alanında ve dünya alanında sağ elini kullanır .
Ancak pencere alanında (diğer adıyla ekran alanı) aniden solak oluruz .
Bu nasıl oldu ?
Sağlaktan solak olana geçme şeklimiz, glOrtho
veya glFrustum
projeksiyon matrislerinde negatif bir z ölçeklendirme girdisidir. Z'yi -1 ile ölçeklendirmek (x ve y'yi olduğu gibi bırakarak), koordinat sisteminin el kullanımını değiştirme etkisine sahiptir.
GlFrustum için,
uzak ve yakın pozitif, uzak > yakın . Uzak = 1000 ve yakın = 1 deyin . O zaman C = - (1001) / (999) = -1.002.
Daha fazla ayrıntı ve diyagram için buraya bakın .
Bir kaynaktan ortografik açısından , glOrtho böyle bir matris oluşturur:
Burada sol , sağ , alt ve üst , sol dikey , sağ dikey , alt yatay , üst yatay kırpma düzlemleri (resp) için yalnızca koordinatlardır .
Ancak yakın ve uzak düzlemler farklı şekilde belirtilmiştir . Civarındaki bir parametre olarak tanımlanır
- Yakın: Daha yakın derinlik kırpma düzlemine olan mesafe . Uçak izleyicinin arkasında olacaksa bu mesafe negatiftir.
ve uzak:
- zFar Daha uzak derinlik kırpma düzlemine olan mesafe . Uçak izleyicinin arkasında olacaksa bu mesafe negatiftir.
Burada tipik bir kanonik görünüm hacmine sahibiz
Z çarpanı (-2 / (çok yakın)) olduğundan , eksi işareti z'yi -1 ile etkili bir şekilde ölçeklendirir . Bu, "z" 'nin görüntüleme dönüşümü sırasında sol elle çevrildiği anlamına gelir, çoğu insan sadece OpenGL'de "sağ elini kullanan" bir koordinat sistemi olarak çalıştıklarından habersizdir.
Yani ararsan
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
O zaman YAKIN UÇAK sizden 10 birim önde . Neredesin? Neden, başlangıç noktasında, x ekseni sağınızda, y ekseni başınızın üstünde ve burnunuz negatif z eksenini gösteriyor (varsayılan olarak bu "Varsayılan olarak, kamera başlangıç noktasındadır. , negatif z eksenini işaret eder ve yukarı vektörü (0, 1, 0). " ). Yani yakın düzlem z = -10'da. Uzaktaki düzlem, z = + 10'da 10 birim arkanızda .