Görünüm penceresinin esnemesini / bozulmasını nasıl önleyebilirim?


13

Temel olarak, görünüm / pencere boyutu değiştiğinde oluşturulan görüntünün bozulmasını veya gerilmesini nasıl kaldırabileceğimi bilmek istiyorum.

Aşağıdaki resimlerde bahsettiğim bozulma / esneme örneği var:

Orijinal Görüntü (Kare Pencere)

Bozulma Yok

Bozuk / Gerilmiş Görüntü (Dikdörtgen Pencere)

Bozulma ile

İdeal olarak, ikinci görüntü küreyi yatay olarak uzanmadan göstermelidir ve daha büyük pencere boyutunu hesaba katmak için daha fazla sahne kullanıcıya gösterecektir.

Bu nasıl yapılabilir?

Görüntüyü oluşturmak için OpenGL ile çalışıyorum ve görüşmeler yoluyla perspektif projeksiyonunu kullanıyorum:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

En boy oranı width/height, karşılaştığım tüm belgelere / eğiticilere uygun, bu yüzden yanlış olmasını beklemiyorum. Ancak, şüphem bunun gerilme problemini etkilemesidir.


Düşünceden sonra

Dürüst olmak gerekirse, konuyu daha fazla düşündüğümde, çözümün fovy (y yönünde görüş alanı) açısı ile en boy oranı arasında doğrudan orantılı bir ilişki içerdiğine inanmaya başlamıştım.

Perspektif İzdüşümü

Yukarıdaki görüntüyü referans olarak kullanarak, genişlik büyürse (yatay bir gerilmeye neden olursa), sarmaşık açısının, oluşturulan görüntünün orantılılığını 'sabitleyen' dikey bir gerilmeye neden olması için çok makul olduğu düşünülmektedir.

Benzer şekilde, genişlikteki bir azalma, fovy açısının azalmasını gerektirir.

Güncelleme:

Bu nedenle, bunu daha ayrıntılı bir şekilde araştırdıktan sonra, görüntüleme frustumunu şu şekilde ayarlama yöntemimi değiştirmeye karar verdim:

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

Ve beklentilerim doğruydu, bu orantılılık sorununu çözdü. Ancak, istediğim sonuçları elde edemiyor. Pencere genişliği arttığında, oluşturulan görüntü küçülür (ancak küre gerçekten daireseldir). Bunun yerine, küre hiç boyut değiştirmemelidir; yalnızca görüntülenen sahne miktarı değişmelidir.

Yanıtlar:


14

Aslında, asıl soru çözümden 1 çıktı.

Orijinal Kod

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

Sabit Kod

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

Sorun şuydu window.widthve window.heighten boy oranının bir tamsayı bölünmesinin sonucu olmasına neden olan tamsayılardı.

Boyutlardan birini bir kayan noktaya dökmek, sonucun kayan nokta bölmesini kullanmasına neden olur.

En-boy oranı artık doğru olduğundan, orijinal gönderide görüldüğü gibi daha fazla gerilme yoktur.

DÜZENLEME: Orijinal gönderideki kod (ve yanıt) GPU çağrıları için yalnızca sözde koddur; yukarıdaki görüntüleri çıktılamak için kullanılan gerçek program Java ile yazılmıştır. Java ile çalışmayanlara, tamsayı / kayan nokta bölümünün aynı şekilde uygulanıp uygulanmadığını görmek için araştırma yapmadım. Ne olursa olsun, çözüm en-boy oranının gerçekten doğru bir şekilde hesaplandığından emin olmakla ilgilidir.

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.