OpenGL 2.x II İnönü Üniversitesi
2B Görüntüleme glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluOrtho2D (xmin, xmax, ymin, ymax); veya glOrtho(xmin, xmax, ymin, ymax, near, far); Bu koordinat noktaları içerisindeki nesneler görüntülenir.
glViewport() glViewport(x, y, width, height); Görüntüleme penceresinin sol alt köşesine göre yazılan ekran koordinatlarının tam sayı değerlerini parametre olarak alır. Eğer bu fonksiyon çağrılmazsa, görüntüleme penceresinin tamamı kullanılır. Birden fazla glViewport çağrısı ile bir pencere içinde birden fazla görüntüleme alanı oluşturulabilir. glViewportArray fonksiyonu da aynı işi görmektedir.
glViewport()
glEnable(GL_POINT_SMOOTH); Anti Aliasing glEnable(GL_POINT_SMOOTH);
Anti Aliasing glEnable(GL_LINE_SMOOTH); glLineWidth(1.5); Doğrunun bir dikdörtgen yaklaşımı ile çizdirilmesini sağlar.
Temel Bileşen Detayları glPolygonMode(GLenum face, GLenum mode); face: GL_FRONT, GL_BACK mode: GL_POINT, GL_LINE, GL_FILL glPolygonMode(GL_FRONT, GL_FILL); glRectf(0, 0, 200, 100); glPolygonMode(GL_FRONT, GL_LINE); glRectf(0, 0, 200, 100);
Duyuru Dersle alakalı sorularınız için Z-12’ ye gelebilirsiniz. Vize sınavı 03.12.2013 salı günü saat 11:00’ de yapılacak. OpenGL quizi (şimdilik) 29.11.2013 cuma günü ders saatinde yapılacak.
Çift Arabellek Ön Arabellek: O anda görüntülenenlerin yer aldığı arabellek Arka Arabellek: Görüntülenme talimatı verilen fakat henüz görüntülenmeyen nesnelerin yer aldığı ara bellek glutSwapBuffers(); ile bu iki arabellek güncellenerek akıcı görüntü oluşturulur.
freeGLUT ile Olay Yönetimi Olay Türleri Pencere: Boyut değiştirme, taşıma vb. Fare: Bir ya da daha fazla düğmeye tıklama Hareket: Fare hareketini takip etme Klavye: Bir tuşa basma, basılı tutma, bırakma vb. Boşta: Herhangi bir olayın olmama durumunda ne yapılacağını belirleme (canlandırma vb.) Değişkenler genel alanda (global) tanımlanır, bu sayede kontrol fonksiyonları (callback functions) ortak değişken kullanabilir.
Değişken Kullanım Örneği float t; /*global */ void farekontrol() { //tıklama vb. olaylarla t değeri değiştirilir. } void goruntu() // t ile alakalı bir şeyler çizdirilir.
Klavye Kullanımı glutKeyboardFunc(mykey); void mykey(unsigned char key, int x, int y) Basılan tuşun ASCII değerini ve fare konumunu yan etki olarak döner. F1-F12, CTRL, ALT vb. özel tuşlar için glutSpecialFunc() şeklinde ayrı bir «özel tuş» fonksiyonu tanımlamak gerekir.
Fare Kullanımı glutMouseFunc(mymouse) void mymouse(GLint button, GLint state, GLint x, GLint y) Yan etki olarak Hangi düğmenin olayı tetiklediği (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON) O düğmenin durumunu (GLUT_UP, GLUT_DOWN) Penceredeki konumu verilerini döner. Orijini görüntüleme alanının sol üstünü kabul ederek konumu belirlediğinden OpenGL koordinatlarına uyumlu hale getirmek için y değerinin tersini almak gerekir. (yükseklikten y değerini çıkararak)
3B Görüntüleme 2B grafiği görüntülemek için bitmap ve vektör tabanlı kayıt yapıları mevcuttur. Bitmap yapıda, belli bir boyuttaki resim her pikseline bir renk değeri atanarak gösterilir. Bu gösterim büyük boyutlu resimlerde çok yer kaplar, ayrıca büyütme işlemi sırasında kalite kaybı yaşanır. (GIF, BMP gibi) Vektör yapıda ise doğru ve eğriler, denklemler ile ifade edilir. Bu şekilde oluşturulan resimler, kendilerini ifade eden denklemde bir değişiklik olmayacağından büyütme/küçültme ile kalite kaybına uğramazlar. (Adobe Illustrator, SVG vb.) 640x480 boyutlarında milyon sayıda renk içerebilen bir resmin 307,200 pikseli vardır. Sıkıştırılmamış halde böyle bir resim 1.22 MB yer kaplar. 3B grafiği bitmap dosyalardan oluşturmak ise devasa bellek alanı gerektirmektedir. Bu sebeple 3B grafiğin gösteriminde vektör tabanlı yapılar kullanılmaktadır.
3B Görüntüleme Ortografik İzdüşüm: Bkz. 2B Görüntüleme Perspektif İzdüşüm: Görüntü hacmini oluşturmak için gereken kamera parametreleri ve yapısı şu fonksiyonlarla belirlenir. gluPerspective(fovangle, aspect, dnear, dfar); glFrustum(xwmin, xwmax, ywmin, ywmax, dnear, dfar); gluLookAt(x0,y0,z0,xref,yref,zref,vx,vy,vz);
Perspektif İzdüşüm Parametreleri gluLookAt fonksiyonun ilk parametresi kamera konumunun, ikinci parametresi bakış vektörünün, üçüncü parametresi üst vektörün bileşenlerini tanımlar. gluLookAt fonksiyonu çağrılmazsa kamera parametreleri şu şekilde tanımlanır. Kamera konumu: (0, 0, 0) Bakış vektörü: (0,0,-1) Üst vektörü: (0, 1, 0) gluPerspective fonksiyonunun ilk parametresi görüş açısını, ikinci parametre kırpma pencerelerinin en boy oranını, üçüncü ve dördüncü parametreler yakın düzlem ve uzak düzlemin mesafelerini belirtir. Burada dikkat edilmesi gereken üçüncü parametrenin dördüncüden küçük bir değere sahip olmasıdır. (dnear < dfar) OpenGL bu parametrelerin negatifini alarak görüntü koordinat sisteminin z ekseninde konumlandırır. gluPerspective simetrik bir görüntüleme hacmi belirtir.
Perspektif İzdüşüm Parametreleri glFrustum fonksiyonunun ilk iki parametresi kırpma pencerelerinin en düşük ve en yüksek x değerlerini, 3. ve 4. parametresi kırpma pencerelerinin en düşük ve en yüksek y değerlerini, son iki parametresi de yakın ve uzak düzlemin mesafeleridir. Görüntü düzleminin normali z, bakış yönü ise –z yönündedir. Eğer xwmin, -xwmax’ a veya ywmin, -ywmax’a eşit değilse eğik perspektif izdüşüm elde edilir. Eşitse simetrik bir görüntüleme hacmi elde edilir.
Ek Kırpma Düzlemleri İhtiyaç halinde mevcut 6 kırpma düzlemine ek kırpma düzlemleri de tanımlanabilir. glClipPlane(id, A, B, C, D); Kırpmayı aktif etmek için: glEnable(id); Kırpmayı iptal etmek için: glDisable(id); Burada id, GL_CLIP_PLANE0, GL_CLIP_PLANE1 ile ifade edilen bir değişken; A, B, C, D ise Ax+By+Cz+D=0 düzlem denklemindeki katsayılardır. Buna göre koordinatları ile bu denklemde sıfırdan küçük değerler veren tüm nesneler kırpılır.
Geometrik Dönüşümler Taşıma: glTranslate(d, f, i)(tx, ty, tz); tx, ty, tz: x, y ve z eksenindeki taşıma miktarlarıdır. 2B görünümde tz’yi 0 yapmak yeterlidir. Döndürme: glRotate(d, f, i)(theta, vx, vy, vz); theta: Derece cinsinden açı değeri vx,vy,vz: Orijinden geçen dönme ekseninin bileşenleri Ölçekleme: glScale(d, f, i)(sx, sy, sz); Yansıma için eksi değerler kullanılır. Örnek glTranslatei (25,32,6); glRotatef(45.0,1,0,-2.0,1.0); glScaled(4.25,4.25,4.25);
OpenGL Dönüşüm Modeli 𝑇= 𝑀 𝑖𝑧𝑑üşü𝑚 𝑀 𝑘𝑎𝑚𝑒𝑟𝑎 𝑀 𝑚𝑜𝑑𝑒𝑙 𝑇= 𝑀 𝑖𝑧𝑑üşü𝑚 𝑀 𝑘𝑎𝑚𝑒𝑟𝑎 𝑀 𝑚𝑜𝑑𝑒𝑙 glMatrixMode(GL_PROJECTION); glMatrixMode(GL_MODELVIEW); Sahnedeki bütün geometriye uygulanır. Kamera koordinatlarını normalize edilmiş koordinatlara dönüştürme GL_PROJECTION Yerel koordinatları kamera koordinatlarına dönüştürme GL_MODELVIEW
OpenGL Dönüşüm Modeli GL_MODELVIEW: Kameranın (gözün) konumunu belirleyen matristir. Kamera uzayının orijin bilgilerini Bakış yönü vektörünü Kamera yönelim (orientation) bilgisini içerir. GL_PROJECTION: İzdüşüm özelliklerini belirleyen matristir. Alan derinlik (depth of view) bilgisini Görüş alanı (field of view) bilgisini içerir.
OpenGL Matris İşlemleri “Modelview” modundayken bir dönüşüm fonksiyonunun çağrılması, o anki matrisle çarpılacak bir matris oluşturur. O anki matrisin içeriği doğrudan da değiştirilebilir. glLoadIdentity(); - Birim matrisi yükler. glLoadMatrix(d,f,i)(matris); - İstenen 4x4 matrisi yükler. 16 elemanlı matrisi sütunları sırayla yazılan bir dizi (array) olarak alır.
OpenGL Matris İşlemleri Örneğin for (int k=0; k<16; k++) elements16[k] = (float) k; glLoadMatrixf(elements16); kodu ile 1.0 5.0 9.0 13.0 2.0 6.0 10.0 14.0 3.0 7.0 11.0 15.0 4.0 8.0 12.0 16.0 matrisi elde edilir. glMultMatrix(d,f,i)(matris); Mevcut matrisle parametre olarak verilen matrisi sağdan çarpar. ( 𝑀 𝑚𝑒𝑣𝑐𝑢𝑡 × 𝑀 𝑚𝑎𝑡𝑟𝑖𝑠 ) Bu yüzden kodlamada peşpeşe yazılan dönüşüm fonksiyonları için; en son yazılan matris, işleme tabi tutulacak ilk dönüşüm matrisi olacaktır.
OpenGL Matris Yığıtı OpenGL 2.x’ de bütün matris modları için bir matris yığıt (matrix stack) yapısı bulunmaktadır. OpenGL dönüşüm fonksiyonları çağrıldığında, bu yığıtın en üstündeki 4x4 matris işleme tabi tutulmaktadır. En üstteki matrise aynı zamanda mevcut matris de denmektedir. Eğer çok sayıda dönüşüm serileri oluşturulacak ve sonucu kaydedilecekse OpenGL matris yığıtı kullanılabilir. Başlangıçta bu yığıtta sadece birim matris vardır.
OpenGL Matris Yığıtı Yığıtta kaç matris olduğunu bulmak için glGetIntegerv(GL_MODELVIEW_STACK_DEPTH,numMats) Mevcut matrisi kopyalayıp ikinci yığıt konumuna kaydetmek için glPushMatrix() kullanılır. En üstteki matrisi yok edip, yerine onun bir altındaki matrisi mevcut matris yapmak için glPopMatrix() kullanılır.
Nesneleri Seçme