COM337 Bilgisayar Grafiği OpenGL ile Grafik Programlama Dr. Erkan Bostancı
İçerik Giriş Dönüşüm matrisleri Matris yığınları (stack)
Giriş İlk olarak gizli yüzeylerin kaldırılmasını (hidden surface removal) inceleyeceğiz. Bu özellik nesnelerin daha gerçekçi görünmesini sağlar. Sonrasında OpenGL de geometrinin nasıl çalıştığını öğrendiğimize göre artık dönüşümleri (transformation) inceleyebiliriz. Son olarak da dönüşüm matrisi yığınlarına bakıp, hiyerarşik modelleme nasıl yapılır onu öğreneceğiz.
Gizli yüzeylerin kaldırılması Örnek 7 OpenGL şu iki çağrı ile hidden surface removal yapabiliriz: glutinitdisplaymode(glut_depth ); glenable(gl_depth_test); Sonrasında ise frame buffer ı temizlediğimizde depth buffer ı da temizleriz. glclear(gl_depth_buffer_bit GL_COLOR_BUFFER_BIT);
Poligonların yalnızca bir yüzü vardır! Çoğu grafik sisteminde çalışırken gördüğümüz bir gariplik poligonların sadece bir yüzeylerinin olmasıdır. Bunun amacı aslında hız açısından performans arttırmak. Kamera tarafından görünebilen poligonlar, normal vektörleri kameraya doğru bakan poligonlardır. Normal vektör bir yüzeye dik olan vektördür. OpenGL in kullandığı yöntemde poligonu oluşturan noktaların saatin ters yönünde (anti-clockwise) belirlenmesi gerekir. Böylece bu poligonların normal vektörleri kameraya bakmış olur ve kamera bunları görebilir. Bu nedenden dolayı, katı bir cismi oluşturan poligonların tamamının normal vektörleri dışa bakmalıdır ve bu poligonları oluşturan noktalar saatin ters yönü sırasında belirtilmelidir.
Matrisler (1/2) OpenGL iki tür matris kullanır: modelview ve projection Modelview, sahnenin oluşturulması ve sanal kamera ile ilgilidir. Projection, özellikle de sahne görüntüsünün oluşturulması ile ilgilidir. Her iki matris de 4x4 boyutlarındadır ve homojen koordinatlar üzerinde işlem yapar. Bir uygulama programı c koordinatını belirttiğinde OpenGL bu koordinata modelview matrisi M ve projection matrisi P yi kullanarak bir dönüşüm uygular. c = PMc
Matrisler (2/2) M ve P nin ikisi de başlangıçta identity bir dönüşüm içerir (yani hiçbir şey yapmaz). Bu matrislerin mantıklı değerlerle doldurulması uygulama programının sorumluluğundadır. Hangi dönüşüm matrisinin etkileneceğini tek parametre alan glmatrixmode kullanarak seçeriz. GL_PROJECTION GL_MODELVIEW Genelde, uygulamalar M matrisini display callback i içinde, P yi de reshape callback i içinde ayarlar. reshape callback i pencerenin boyutu veya şekli değiştiğinde çağrılır.
OpenGL de dönüşümler (1/2) Genelde çağrılar aşağıdaki gibi yapılır: glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (1.0, 0.0, 0.0); glscalef (1.5, 1.0, 0.5); glvertex3f (1.0, 1.0, 1.0); Şu anki dönüşüm matrisini etkileyen OpenGL fonksiyonları, postmultiplication yapar, bu nedenle istediğimiz etkiyi yaratmak için kullandığımız dönüşüm çağrıları ters sıra ile yaparız. Bu kullanım biraz kafa karıştırıcı olabilir, ama OpenGL bu şekilde tasarlanmış.
OpenGL de dönüşümler (2/2) glloadidentity, gltranslatef ve glscalef fonksiyonları zaten açıktır. Dönme için ise glrotatef(glfloat angle, Glfloat x, Glfloat y, Glfloat z) verilen derece cinsinden dönmeyi, orjinden x,y,z ile belirtilen vektör etrafında yapar. C deki açılar radyan parametre alıyordu, glrotatef parametrelerini derece cinsinden alır.
Matris yığınları (1/2) Gerçekte, OpenGL deki modelview matrisi tek bir matris değildir, bir stack in (yığın) üstüdür. 0 (üst) 1 N Bu OpenGL de hiyerarşik modelleme yapmamızı kolaylaştırır. Şu anki matrisi yığına eklemek (push) için glpushmatrix(); 4x4 matris A 0 4x4 matris A 1 4x4 matris A N
Matris yığınları (2/2) Stack in üstündeki yeni matris bir seviye aşağıya itilen ile aynıdır: 0 (üst) 1 2 N Benzer şekilde stack ten almak (pop) için: glpopmatrix(); 4x4 matris A 0 4x4 matris A 0 4x4 matris A 1 4x4 matris A N display fonksiyonu içinde aynı sayıda push ve pop işlemi yapmak önemlidir.
Örnek: Robot kolu (1/4) Örnek 8 Matris yığınlarının kullanımını göstermek amacıyla kullanıcı klavye tuşları ile eklem açılarını değiştirebildiği bir örnek.
Örnek: Robot kolu (2/4) Pencere boyutunun ve şeklinin etkileşimli bir şekilde değiştiğinde sahnenin de buna göre güncellenmesini sağlayan reshape fonksiyonunu (callback) tanımladık ve bunu OpenGL e glutreshapefunc() ile kaydettik. Bu fonksiyon ilk olarak OpenGL in viewport unu ayarlayarak pencereyi doldururur. Sonradan da projection matrisini ayarlar. gluperspective(gldouble fovy, Gldouble aspect, Gldouble near, Gldouble far) Burada fovy, yz düzlemindeki bakış açısıdır ve aspect viewport un aspect ratio sudur (en-boy oranı). Kameraya göre near ve far arasında kalan uzaklıklarda bulunan nesneler çizillir diğerleri kırpılır (clipping).
Örnek: Robot kolu (3/4) keyboard callback i içindeki kod, omuz, dirsek ve bilek açılarını değiştirir. Üst ve alt kollar ve el scale edilmiş küpler ile modellenebilir fakat açılarını ayarlamak için modelleme dönüşümlerine ihtiyacımız var. Yerel koordinat düzlemi başlangıçta her küpün ortasında olduğu için, pivot noktasını bir kenara çekmemiz gerekiyor. gltranslatef fonksiyonu pivot noktasını ayarlar ve glrotatef dönmeyi sağlar. Sonra tekrar küpün merkezine translate ettikten sonra ve scale ederek çiziyoruz. glpushmatrix ve glpopmatrix fonksiyonlarına yapılan çağrılar glscalef in etkisini sınırlıyor.
Örnek: Robot kolu (4/4) İkinci bir eklemi çizmek için, yerel koordinat sistemini ikinci pivot noktasına taşıyoruz. Koordinat sistemi önceden döndürülmüş olduğu için, x ekseni zaten dönmüş kol kısmı boyunca hizalanıyor. Böylece, x ekseni üzerinde translate ederek pivot noktasını belirleyebiliyoruz.