Öncelikle Merhaba Herkese !
Bu örnek programımızda klavyenin yön tuşlarını kullanarak, nesnemizi sağa, sola, yukarı, aşağı, ileri, geri hareket ettirmeyi başardık. ayrıca klavyemizin karakter düğmelerini kullanarak, prizmamızın boyutlarını değiştirip, y ekseni çevresinde döndüre bildik. Şimdi kaynak kodu inceleyerek GLut açıklamasına bir göz atalım.
//-------------------------------------------------------------------
http://OpenUcboyutHareket.cpp#include <gl/glut.h>
float xgotur = 0, ygotur = 0, zgotur = 0;
float derece = 0;
float xolcu = 1, yolcu = 1, zolcu = 1;
int en = 400,boy = 400;
void GoturSag(void)
{
glLoadIdentity();
xgotur += 0.1;
}
void GoturSol(void)
{
glLoadIdentity();
xgotur -= 0.1;
}
void GoturYuk(void)
{
glLoadIdentity();
ygotur += 0.1;
}
void GoturAsa(void)
{
glLoadIdentity();
ygotur-=0.1;
}
void GoturIleri(void)
{
glLoadIdentity();
zgotur -= 0.1;
}
void GoturGeri(void)
{
glLoadIdentity();
zgotur += 0.1;
}
void YanUzat(void)
{
glLoadIdentity();
xolcu += 0.1;
}
void BoyUzat(void)
{
glLoadIdentity();
yolcu += 0.1;
}
void CevirSag(void)
{
glLoadIdentity();
derece += 0.5;
}
void CevirSol(void)
{
glLoadIdentity();
derece -= 0.5;
}
void Basla(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
}
void Klavye(int dugme, int x, int y)
{
switch(dugme)
{
case GLUT_KEY_LEFT:GoturSol(); break;
case GLUT_KEY_RIGHT:GoturSag(); break;
case GLUT_KEY_UP:GoturYuk(); break;
case GLUT_KEY_DOWN:GoturAsa(); break;
case GLUT_KEY_PAGE_UP:GoturIleri(); break;
case GLUT_KEY_PAGE_DOWN:GoturGeri(); break;
}
glutPostRedisplay();
}
void Klavye(unsigned char dugme, int x, int y)
{
switch(dugme)
{
case 'a':YanUzat();break;
case 's':BoyUzat();break;
case 'z':CevirSol();break;
case 'x':CevirSag();break;
}
glutPostRedisplay();
}
void UcdCokgen(void)
{
glPushMatrix();
glColor3f(1.0, 0.0, 0.0);
glTranslatef(xgotur,ygotur,zgotur);
glRotatef(derece, 0.0, 1.0, 0.0);
glScalef(xolcu, yolcu, zolcu);
glBegin(GL_QUADS);
glVertex3f(-0.4, 0.3, 0.1); //önyüz
glVertex3f( 0.4, 0.3, 0.1);
glVertex3f( 0.4, -0.3, 0.1);
glVertex3f(-0.4, -0.3, 0.1);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-0.4, 0.3, -0.1); //solyanyüz
glVertex3f(-0.4, 0.3, 0.1);
glVertex3f(-0.4,-0.3, 0.1);
glVertex3f(-0.4,-0.3, -0.1);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-0.4, 0.3, -0.1); //arkayüz
glVertex3f( 0.4, 0.3, -0.1);
glVertex3f( 0.4, -0.3, -0.1);
glVertex3f(-0.4, -0.3, -0.1);
glEnd();
glBegin(GL_QUADS);
glVertex3f(0.4, 0.3, -0.1); //sağyanyüz
glVertex3f(0.4, 0.3, 0.1);
glVertex3f(0.4, -0.3, 0.1);
glVertex3f(0.4, -0.3, -0.1);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-0.4, 0.3, 0.1); //üstkapak
glVertex3f( 0.4, 0.3, 0.1);
glVertex3f( 0.4, 0.3, -0.1);
glVertex3f(-0.4, 0.3, -0.1);
glEnd();
glBegin(GL_QUADS);
glVertex3f( 0.4, -0.3, 0.1); //altkapak
glVertex3f(-0.4, -0.3, 0.1);
glVertex3f(-0.4, -0.3, -0.1);
glVertex3f( 0.4, -0.3, -0.1);
glEnd();
glPopMatrix();
}
void CizimYeri(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glLoadIdentity();
gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
UcdCokgen();
glutSwapBuffers();
}
void TekrarBoyut(int en, int boy)
{
glViewport (0, 0, en, boy);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(90, (float)en / (float)boy, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (en, boy);
glutInitWindowPosition (0, 0);
glutCreateWindow ("OpenGL- Üç boyutlu model çokgeni hareket ettirmek");
Basla();
glutReshapeFunc(TekrarBoyut);
glutDisplayFunc(CizimYeri);
glutSpecialFunc(Klavye);
glutKeyboardFunc(Klavye);
glutMainLoop();
return 0;
}
//-------------------------------------------------------------------
GLut
Açıklamalar
glutKeyboardFunc()
glutSpecialFunc()
Bu iki işlevde geri çağırmalı komuttur. Ayraçlarının içine kendimizin belirleyeceği işlevin adını yazıp, kaydettiririz. Program içinde, OpenGL bu işlevi çağırıp işler. glutKeyboardFunc() işlevine kaydettirdiğimiz işlevin ayracı içinde, klavyede kullanılacak karakterlerin unsigned char türünde (x, y) bilgilerini gösteren bilgiler bulunur. örnekte kaydettirmek istediğimiz işlevin adı (Klavye) idi.
void Klavye(unsigned char dugme, int x, int y)
Bu işlev ile yalnız karakter düğmelerini kullana biliriz (a, b, c, d) gibi.
void Klavye(int dugme, int x, int y)
GLUT_KEY_F1
GLUT_KEY_F2
GLUT_KEY_F3
GLUT_KEY_F4
GLUT_KEY_F5
GLUT_KEY_F6
GLUT_KEY_F7
GLUT_KEY_F8
GLUT_KEY_F9
GLUT_KEY_F10
GLUT_KEY_F11
GLUT_KEY_F12
GLUT_KEY_LEFT
GLUT_KEY_RIGHT
GLUT_KEY_UP
GLUT_KEY_DOWN
GLUT_KEY_PAGE_UP
GLUT_KEY_PAGE_DOWN
GLUT_KEY_HOME
GLUT_KEY_END
GLUT_KEY_INSERT
Bu işlevde klavye üzerinde' ki özel işlev düğmelerini kullana biliriz. bunlar yukarıda sıralanmıştır. Programımızda GLUT_KEY_PAGE_UP özel düğmesi, modelimizi ileriye doğru (pencerenin derinlemesine -z ekseni boyunca) götürmekten sorumludur. Bu özel düğmeye basınca, GoturIleri() işlevi çağrılır, buradan zgotur değişkenine (-0.1) değeri eklenir ve Klavye() işlevinden, glutPostRedisplay() işlevi yardımıyla bu bilgiler CizimYeri(void) işlevine aktarılıp işlenir. Diğer tüm hareketlerin çalışması aynı bu yönde gelişir.
glutLookAt(x0, y0, z0, x1, y1, z1, x2, y2, z2)
Bu işlevin ilk üç parametresi x0, y0, z0 kameranın konumunu ayarlar. Eğer baktığımız modele çok yakınsak ekranımızda hiç birşey göremeyiz. Bunun tersi durum olarakta, modelimizin önündeysek, Bu durumda model kameranın arkasında kalacağı için ekranda yine birşey göremeyiz. Bu yüzden kameramızı modeli tamamen göre bileceğimiz bir uzaklığa çekmeliyiz. Gösterim dönüşümü işlevi olan glFrustum() komutundaki (yakın ve uzak) değerlerinin arasındaki bir değere kameramızı ayarlaya biliriz. Yalnız yukarıdaki programda, Gösterim dönüşümü işlevi olarak gluPerspective() işlevi kullanılmıştır, yakın ve uzak değerlerinin kullanımı iki işlevdede aynı olduğu için bir sorun çıkmaz. Kameramızı bu yakın ve uzak değerlerinin arasında bir değere ayarlayabiliriz. Kameramızın bu mercek ayarı, gluLookAt() işlevindeki ( z0 ) parametresiyle yapılır. Örneğimizde yakın değer (1.0) uzak değeri (2000.0) seçilmiş, demekki biz modelimizi görünür kılmak için, bu iki değer arasında bir değer seçmeliyiz. Biz örnekte 2.0 değerini uygun gördük. Siz farklı değerler vererek deniye bilirsiniz ve sonucu daha iyi gözlersiniz. gluLookAt() işlevinin ( y0 ) parametresi kameramızın tepeden veya aşağıdan bakmasını, ( x0 ) parametresi ise kameramızın modele sağdan veya soldan bakmasını sağlar. Sonraki üç parametre ( x1, y1, z1 ) kameramızın yönlendirilmesini sağlar. ( x2, y2, z2 ) modelimize dikmi yoksa yanmı bakacağımızı ayarlar. Dik bakacaksak kamerayı dik tutmak zorundayız, bu yüzden ( y2 ) parametresini (1) olarak ayarlamalıyız. Eğer kameramızı yana yatıracaksak bukez ( x2 ) parametresiyle oynamalıyız. Ancak genellikle kamera dik konumda tutulduğu için ( y2 ) ekseni (1) diğerleri (0) değerleriyle kullanılır.