İçeriğe geç

OpenGL ile 3 Boyutlu Çizim ve Döndürme İşlemi

Bir önceki makalemizde OpenGL ile 2 boyutlu bir çizimi nasıl yapabileceğimizi öğrenmiştik. Şimdide buna benzer şekilde 3 boyutlu bir çizim yapacağız de devamında ise olşan cismi klavyeden alacağımız yönledirmeler doğrultusunda döndürme işlemini gerçekleştireceğiz.

İlk olarak 3 boyutlu cismimizin ne olacağını kararlaştırıp kordinat düzlemindeki noktalarını belirliyoruz. Daha sonra bu noktalar yardımı ile çizimimize başlayacağız. Ben çizimimde bir dörtgen prizması ve bir üçgen pramit kullarak ev profili oluşturmaya çalışacağım. Çizim işlemini gerçekleştiren bölüm :

int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_QUADS); // Dörtgen Prizması başlangıcı
glColor3f(1.0f,0.0f,0.0f);

// Ön taraf
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f,1.0f, -1.0f);
glVertex3f(-1.0f,1.0f, -1.0f);

// Sol Yan Taraf
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( -1.0f, -1.0f, -3.0f);
glVertex3f( -1.0f,1.0f, -3.0f);
glVertex3f(-1.0f,1.0f, -1.0f);

// Taban Taraf
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( -1.0f, -1.0f, -3.0f);
glVertex3f( 1.0f,-1.0f, -3.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);

// Sağ Yan Taraf
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -3.0f);
glVertex3f( 1.0f,1.0f, -3.0f);
glVertex3f( 1.0f, 1.0f, -1.0f);

// Üst Taraf
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f( -1.0f, 1.0f, -3.0f);
glVertex3f( 1.0f,1.0f, -3.0f);
glVertex3f( 1.0f, 1.0f, -1.0f);

//Arka Taraf
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f, -1.0f, -3.0f);
glVertex3f( 1.0f, -1.0f, -3.0f);
glVertex3f( 1.0f,1.0f, -3.0f);
glVertex3f(-1.0f,1.0f, -3.0f);

//pencere
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-0.5f, -0.5f, -1.0f);
glVertex3f(-0.5f, 0.5f, -1.0f);
glVertex3f(0.5f, 0.5f, -1.0f);
glVertex3f(0.5f, -0.5f, -1.0f);

glEnd(); // Dörtgen Prizması Çizim Bitimi

glBegin(GL_TRIANGLES); // Üçgen Pramit Çizim Başlangıcı

// Pramit Ön Parça
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( -1.0f, 1.0f, -1.0f);
glVertex3f(1.0f,1.0f, -1.0f);
glVertex3f( 0.0f,3.0f, -2.0f);

// Pramit Sol Parça
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( -1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f,1.0f, -3.0f);
glVertex3f( 0.0f,3.0f, -2.0f);

// Pramit Arka Parça
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( -1.0f, 1.0f, -3.0f);
glVertex3f(1.0f, 1.0f, -3.0f);
glVertex3f( 0.0f,3.0f, -2.0f);

// Pramit Sağ Parça
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f, -3.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f( 0.0f,3.0f, -2.0f);
glEnd(); // Üçgen Pramit Çizim Bitimi

return TRUE;

}

Çizim işlemini gerçekleştirdikten sonra oluşan görünüm ise resimdeki gibi oluyor.
Çizim işlemini tamamladıktan sonra ilk olarak global değişkenler tanımlayalım. Bu değişkenler x ve eksenlerinde ki dönme işlemlerimizdeki hız büyüklüğünü tuatacağımız değişkenler olacak.
GLfloat xspeed;
GLfloat yspeed;
GLfloat z=-5.0f;
GLfloat xrot;
GLfloat yrot;
Değişkenlerimizi de tamamladıktan sonra dönme işlemini gerçekleştirecek satırları DrawGLScene() fonksiyonumuzun içerisine eklemeye. glLoadIdentity(); satırının altına aşağıdaki satırları ekleyelim.
glTranslatef(0.0f,0.0f, -2.0f); // şekli merkeze taşıdık , z eksenin de iki birim ilerlettik
glRotatef(xrot,0.0f,1.0f, 0.0f);
glRotatef(yrot,1.0f,0.0f,0.0f);

glTranslatef(0.0f,0.0f, 2.0f); // şekli z ekesninde 2 birim götürmüştük aynı miktarda geri getirdik
Bu satırlardaki döndürme işlemlerinden önce ve sonra eklemiş olduğumuz glTranslatef fonksiyonlarını şeklimizin merkezini önce 0,0,0 noktasına taşıyıp daha sonra tekrar eski konumuna taşımak için kullandık. glRotatef() fonksiyonları sayesinde de dönme işlmlerini gerçekleştirdik, xrot ve yrot değişlenleri de dönme hızlarını belirliyor. Uygulamalarınızda fonksiyon içerisindeki değişkenleri değiştirip ortaya çıkan sonuçları gözlemleyerek daha iyi bir şekilde kavrayacağınızdan eminim ve bu konuda birde glTranslatef() fonksiyonlarını kaldırarak değişimleri gözlemenizi istiyorum. Şimdide son olarak DrawGLScene() fonksiyonunda return TRUE dan sonra
xrot += xspeed;
yrot += yspeed;
bu iki satırı uygulamamıza ekleyelim. Bunlarıda tamamladıktan sonra bu dönme işlmerini klavyemizden kontrol etmek için şu satırları eklememiz gerekiyor :
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
….
}
else
{
…..
else
{
SwapBuffers(hDC);
if (keys[VK_UP])
{
yspeed+=0.01f; // yukarı yöntuşuna basılırsa
}
if (keys[VK_DOWN])
{
yspeed-=0.01f; //aşağı yöntuşuna basılırsa
}
if (keys[VK_RIGHT])
{
xspeed+=0.01f; //sağ yöntuşuna basılırsa
}
if (keys[VK_LEFT])
{
xspeed-=0.01f; //sol yöntuşuna basılırsa

}

}
xrot += xspeed; // alınan hız değerleri xrot ve yrot değişkenlerine aktarılıyor

yrot += yspeed;

Bu son değişikliklerden sonra uygulamamızı çalıştırdıktan sonra uygulamamızı çalıştırdıktan sonra elde edeceğimiz görüntü ise şekilde ki olacak.
Üç boyutlu şekil çizme ve bu cismi döndürme işlemlerini en basit hali ile sizlere aktarmaya çalıştım. Eğer cisminizi döndirmek değil hareket ettirmek isterniz glTranslatef() fonksiyonu sayesinde gerçekleştirebilirsiniz. Bu konudaki sorularınızı , görüşlerinizi forumlarımızdan yada e-posta göndererek iletebilirsiniz. Bir sonraki yazıda görüşmek üzere.

 

Kategori:OpenGL

İlk Yorumu Siz Yapın

Bir cevap yazın

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