Yazan : Şadi Evren ŞEKER

OpenGL üzerinde şekil değiştirme işlemleri ilgili yazılarda açıklanmıştır. Bu yazının amacı şekil değiştirme işlemlerinin birden fazla olması durumunda kullanılabilecek OpenGL fonksiyonlarını açıklamaktır.

Öncelikle OpenGL içerisinde anlık olarak tek bir matris aktiftir. Şekiller basılmadan önce bu masfuf(matrix) ile çarpılarak transform olup ekrana basılırlar.

Herhangi bir anda bu matirisin temizlenmesi için birim matris (Identity Matrix) hafızaya yüklenebilir:

glLoadIdentity();

Yukarıdaki bu fonksiyon ile birim matris hafızaya yüklenir. Örneğin 4×4 boyutlarındaki birim matris aşağıdaki şekildedir.

1000
0100
0010
0001

Yukarıda da görüldüğü üzere birim matrisin diyagonu 1’lerden oluşmakta bunun dışındaki değerleri ise 0’dan oluşmaktadır. Dolayısıyla örneğin x,y,z,w ‘dan oluşan bir noktanın çarpım sonucu aşağıdaki şekildedir:

x
y
z
w

x= x , y = y , z = z, w = w sonuçları çıkar ki bu da noktaların orjinal koordinatlarıdır.

OpenGL’de kullanılan diğer bir yapı da stack (yığın) yapısıdır. Bu yapıdan faydalanarak herhangi bir dönüşüm (transformation) hafızadan alınarak yığına (stack) konulabilir. bu işlem:

glPushMatrix() ve glPopMatrix() fonksiyonları kullanılabilir.

Anlık olarak hafızada hazır bekleyen dönüşümü yığına koyar (push) veya yığında en üstte olan matrisi alarak hafızyaa yükler (pop).

Ayrıca sıkça gereken matrix çarpımı için de OpenGL’de hazır fonksiyonlar bulunmaktadır. Bu fonksiyonlar sayesinde birden fazla dönüşüm matrisi birbiri ile çarpılarak tek bir matris elde edilebilir. Bunun anlamı iki ayrı dönüşümü elde edilen bu tek matris ile yapmanın mümkün olduğudur.

glLoadIdentity ( );
glMultMatrixf(M2);
glMultMatrixf(M1);

Yukarıda sırasıyla önce birim matris yüklenmiştir. Ardından M2 matrisi ile hafızada yüklü olan matris çarpılmış ve hafızada M2 dönüşüm matrisi geçerli hale gelmiştir.

3. satırda M1 dönüşüm matrisi o anda hafızada bulunan M2 matrisi ile çarpılmış ve hafızada geçerli olan dönüşüm matrisi M1.M2 haline gelmiştir.

Aşağıda dönüşümlerin yapıldığı örnek iki kod bulunmaktadır:

glMatrixMode(GL_MODELVIEW);
// 1. sekildeki mavi kutu
glColor3f(0.0, 0.0, 1.0);
Recti(50, 100, 200, 150);
//1. sekildeki kirmizi kutu
glColor3f(1.0, 0.0, 0.0);
glTranslatef(-200.0, -50.0, 0.0);
Recti(50, 100, 200, 150);
//2. sekil
glLoadIdentity ( );
glRotatef(90.0, 0.0, 0.0, 1.0);
Recti(50, 100, 200, 150);
//3. sekil
glLoadIdentity ( );
glScalef(-0.5, 1.0, 1.0);
Recti(50, 100, 200, 150);

Yukarıda verilen bu kodun ekran çıktısı aşama aşama aşağıdaki ekranda gösterilmiştir.

Yukarıdaki kod ile aynı sonucu veren aşaıdaki kodu yazmak da mümkündür.

glMatrixMode(GL_MODELVIEW);
//1. sekildeki mavi kutu
glColor3f(0.0, 0.0, 1.0);
Recti(50, 100, 200, 150);
// push matris ile izole bir donusum yapılıyor
glPushMatrix();
glColor3f(1.0, 0.0, 0.0);
glTranslatef(-200.0, -50.0, 0.0);
Recti(50, 100, 200, 150);
// pop matrix yapilarak orjinal matrise donuluyor
glPopMatrix();
glPushMatrix();
// ikinci bir donusum (transformasyon) yapilarak

// diger donusumlerden izole ediliyor
glRotatef(90.0, 0.0, 0.0, 1.0);
Recti(50, 100, 200, 150);
// dondurme (rotate) islemi bittikten sonra

// orjinal matris hafizaya geri yukleniyor
glPopMatrix();
glScalef(-0.5, 1.0, 1.0);
Recti(50, 100, 200, 150);

Yukarıdaki bu kodun ilk koddan farkı kullanılan stack (Yığın) yapısıdır. Buna göre glLoadIdentity() fonksiyonu ile yapılan dönüşümlerin (transformations) temizlenmesi ve şeklin orjinal halinin basılması mümkün iken, Push ve PopMatrix komutları ile de birbirinden izole dönüşümler elde etmek mümkündür.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir