C++ / OpenGL [ 06 – Callbacks ]

GLUT  Callbacks

// http://www.opengl.org/resources/libraries/glut/spec3/node45.html   butun glut callback fonksiyonlari aciklamalari opengl in kendi sitesinden

kullanabilecegimiz callback fonksiyonlari yukarda gosterilmistir.

Bunlardan bu dersimizde klavye ve mouse fonksiyonlarina agirlik vericez.Callbackslerden 2 tanesini onceki derslerimizde gormustuk;

glutDisplayFunc(func);   // bildiginiz uzere cizimi ekrana doken glut fonksiyonumuz.

glutReshapeFunc(func);   // pencere boyut degisiminde gerceklesitirilcek ayarlari kapsayan glut fonksiyonumuz.

glutKeyboardFunc(func);

onceki dersimizde kullandigimiz caydanlik programinin uzerine ekliyerek devam edicez.

Asagidaki kodda yeni ekledigimiz keyboard fonksiyonumuzu yukari cagiriyoruz.

[c language=”++”]

//kullanicagimiz yardimci kutuphaneler
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
//Glut herzaman gl ve glu dan sonra eklenicek
#include <glut.h>

//Kutuphanemizi manual olarak cagiriyoruz
#pragma comment(lib, "glu32.lib")

//Fonksiyonlarimizi Cagiriyoruz
void keyboard(unsigned char key, int x, int y); // [YENI]
void Init();
void RenderDisplay(void);
void ReShape(GLsizei width, GLsizei height);

[/c]

klavyeden w tusuna basarak caydanligimizi ceviricez bunun icin Rotate komutunu kullanicaz burdaki aciyi saklamasi icin

bir tane float tanimliyoruz.

[c language=”++”]

float    doncaydanlikdon = 0; // [YENI]

[/c]

Ana fonksiyonumuza  glutKeyboardFunc(keyboard);   // glut klavye fonksiyonunu ekliyoruz.

[c language=”++”]

//Ana fonksiyonumuz
void main(int argc, char **argv)
{
//glut pencere icin sabit komut
glutInit(&argc,argv);
//goruntu ayari
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
//Penceremizin boyutu x,y
glutInitWindowSize (640, 480);
//Penceremizin ekranda bulunacagi konum x,y sol ust koseden baslayarak
glutInitWindowPosition (100, 100);
//pencereyi olusturur
glutCreateWindow("BASLIK");

glutKeyboardFunc(keyboard); // [YENI]

//Ayarlarimizin tutuldugu fonksiyonumuzu cagiriyoruz
Init();
//kendi cizim fonksiyonumuzu GLUT icin cagiriyoruz
glutDisplayFunc(RenderDisplay);
//pencere boyutu degisikligi icin cagirdigimiz glut fonksiyonumuz
glutReshapeFunc(ReShape);

//GLUT penceresi icin Ana dongu
glutMainLoop();

}

[/c]

Buradan sonrasi ayarlar,display,reshape fonksiyonlarimizin oldugu bolum

[c language=”++”]
//Ayarlarimizin bulunacagi fonksiyonumuz
void Init()
{
//arkaplani siyaha boyuyoruz
glClearColor (0.0, 0.0, 0.0, 0.0);
}
//Ana Cizim fonksiyonumuz
void RenderDisplay(void)
{
//Cizimden once Ekranimizi tamamen derinlik ve renk olarak temizler.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Matriximiz icin kayit aciyoruz
glPushMatrix();
//yapilacak cizimin konumunu kaydirir x,y,z (x sagsol,y asagi yukari,z iceri disari)
glTranslatef(0,0,-5);
//Cisimi dondurmek icin kullanicagimiz kod
glRotatef(doncaydanlikdon, 0.0, 1.0, 0.0);        // [YENI]
//suanki rengi kirmiziya donusturur
glColor3f(1,0,0);
//bizim icin kare olusturan kod 4 noktasi icin kordinatlar
glutWireTeapot(1.0f);
//Matriximiz icin kayit kapatiyoruz
glPopMatrix();

//buffer lari cevirir cizimi ekrana doker
glutSwapBuffers();
}
//Penceremiz yeniden boyutlandirildiginda GLUT tarafindan cagirilacak fonksiyonumuz
void ReShape(GLsizei width, GLsizei height)
{
if (height==0)// 0 a bolunurse
{
height=1;// boyutu 1 yap
}

/*Viewport OpenGL nin kullanabilecegi gercek cizim koordinat
alanini belirlemektedir.Egre gercek pencerekoordinatlarindan
daha kucuk bir viewport belirlerseniz cizim daha kucuk olarak olceklenecektir.*/
glViewport (0, 0, (GLsizei) width, (GLsizei) height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//goruntu ekran ile ortusturulup boyutunun ortada sabit kalmasi icin
//glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
//goruntu alanimiz ve acimiz
gluPerspective(45.0, (GLfloat) width/(GLfloat) height, 0.0, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

[/c]

cizimleri olusturdugumuz RenderDisplay fonksiyonumuzda caydanligin icinde bulundugu matrise glRotatef(doncaydanlikdon,0.0,1.0,0.0); 

degisimi yapiyoruz burada (float) doncaydanlikdon degerimiz Donme acisi.Y ekseninde donmesi icin y degerini 1.0 yapiyoruz.

Simdi ekledigimiz klavye fonksiyonunu olusturmamiz gerekiyor.

[c language=”++”]

//KeyboardFonksiyonumuz
void keyboard(unsigned char key, int x, int y)
{
if(doncaydanlikdon>360.0f) doncaydanlikdon-=360.0f;

switch (key) {
case 27: // ESC tusu exit icin ASCII
exit(0);
break;
case ‘w’:

++doncaydanlikdon;
glutPostRedisplay();

break;
default:
break;
}
}

[/c]

klavye fonksiyonumuza deginecek olursak

if(doncaydanlikdon>360.0f)  doncaydanlikdon -= 360.0f;

//Eger doncaydanlikdon degerimiz 360 tan buyuk olursa tekrar 0 lanmasini istedik

cunku tam bir donus 360 derece olacagindan degerimizin 360 tan yukari ornegin 1000lere cikmasini

istemeyiz.

Switch (key){

case 27:   // Eger basilmis tus(key)  27 degerine gelen tus ise (ESC)

exit(0);  // Programdan cik

break;  // bitir sonraki secime gec

case “w” :  // basilan tus kucuk “w” ise

++doncaydanlikdon;   // (float) doncaydanlikdon degerini 1.0 arttir.

glutPostRedisplay();    // Bir cesit hareketli animasyon yapildigindan her islemde ekranin tekrar

cizilmesi icin gereken glut fonksiyonu (her w basildiginda caydanligi y ekseninde 1 derece dondur ve ekrana dok)

 

Ders sonunda olusturdugumuz projenin .cpp kaynak dosyasini buradan indirebilirsiniz.

OpenGL -04

 

Leave a Reply

Your email address will not be published. Required fields are marked *