C++ / OpenGL [ 09 – Kamera ]

Goruntuleme Ayarlari

Kamera kiyaslamasi;

chap3-17

Resim 1.0 Referans;http://www710.univ-lyon1.fr/~jciehl/Public/OpenGL_PG/ch04.html

OpenGL kütüphanesi ile uzayda istenilen bir noktaya kamerayı koymak ve bu noktadan istenilen bir yöne istenilen açı ile bakmak mümkündür. Gerekli olan ogeler;

  • Kameranın bulunduğu koordinatlar
  • Kameranın baktığı yöndeki noktanın koordinatları
  • Kameranın bu eksen üzerindeki açısı

Kısaca bu durum aşağıdaki şekilde görüntülenmiştir:

CameraOpenGL_thumb2

Yukarıdaki şekilde de gösterildiği üzere kamera verilen eyex, eyey ve eyez koordinatlarına yerleştirilmiş ve kameranın odak çizgisi verilan centerx, centery ve centerz koordinatlarına yöneltilmiştir.

ornek bir program olusturalim;

[c language=”++”]
#include <windows.h>
#include <glut.h>

void init(void) {
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glLoadIdentity();
//Kamera pozisyonu ve baktigi kordinatlar
gluLookAt(3.0, 3.0, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//Telden kup cizdik
glutWireCube(1.0);
glFlush();
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 200.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
//Dosya konumu (baslik)
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
[/c]

yukarida gordugumuz

glFrustum fonksiyonuna verilen değerlere bakıldığında sol-sağ aralığı 1.0 ile -1.0 aralığında ,
üst-alt aralığı da 1.0 ile -1.0 aralığında olmaktadır. Dolayısıyla bir kare görüntü kameraya yansıtılacak ve şekillerin en/boy oranı 1′e 1 olarak görüntülecenektir.
Ayrıca yakın düzlem 1.5 ve uzak düzlem 20 olarak verilmiştir. Bunun anlamı bu uzaklıklar arasında kalan şekiller gluPerspective fonksiyonunda verilen perspektif değerlerine göre yansıtılacaktır.

Projemizin goruntusu;

ders09

Translate ve Rotate Fonksiyonlariyla Cisimlerin Pozisyonunu Degistirme

Burada kullanicagimiz kamera hareketlerinin yonlendirebilmemiz icin klavye fonksiyonlarimizdan yararlanacagiz.C++ / OpenGL [ 06 – Callbacks ]
Daha once array dersimizde yaptigimiz kup ciziminden yararlanacagiz. C++ / OpenGL [ 05 – Array ]

oncelikle kutuphanelerimizi ekliyoruz;

[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>

//Command Ekrani Kapamak Icin
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
//Kutuphanemizi manual olarak cagiriyoruz
#pragma comment(lib, "glu32.lib")
[/c]

Burada gordugunuz
#pragma comment( linker, “/subsystem:\”windows\” /entry:\”mainCRTStartup\”” ) 
program acilisinda karsimiza cikan cmd ekranimizi kapamamiza yarayan kodumuz.

devam ediyoruz;
kupumuzun arraylerini ayarliyoruz

[c language=”++”]
GLfloat vertices[][3] = { {-1.0,-1.0,-1.0},
{1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0},
{-1.0,-1.0,1.0}, {1.0,-1.0,1.0}, {1.0,1.0,1.0},
{-1.0,1.0,1.0}};
GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},
{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0},
{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};
[/c]

ve goruntu hareketlerimiz icin degiskenlerimizi belirliyoruz.

[c language=”++”]
//Goruntu kameramiz icin degiskenlerimizi belirledik.
float hareketX = 0.0,
hareketY = 0.0,
hareketZ = 0.0,
dondurZ = 0.0,
dondurY = 0.0,
dondurX = 0.0;
[/c]

fonksiyonlarimizi cagiriyoruz.

[c language=”++”]
//Fonksiyonlarimizi Cagiriyoruz
void keyboard(unsigned char key, int x, int y);
void Init();
void RenderDisplay(void);
void ReShape(GLsizei width, GLsizei height);
[/c]

Ana fonksiyonumuzu olusturuyoruz.

[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("Erimicel.com | Erym Sources");

//Klavye fonksiyonmuzu ekledik
glutKeyboardFunc(keyboard);
//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]

ayar fonksiyonumuzu olusturuyoruz.

[c language=”++”]
//Ayarlarimizin bulunacagi fonksiyonumuz
void Init()
{
//arkaplani siyaha boyuyoruz
glClearColor (0.0, 0.0, 0.0, 0.0);
//3 boyutlu cisimlerin onde veya arkada olup olmadigini belirler
glEnable(GL_DEPTH_TEST);
}
[/c]

Boyutlandirma fonksiyonumuzu olusturuyoruz.

[c language=”++”]
//Penceremiz yeniden boyutlandirildiginda GLUT tarafindan cagirilacak fonksiyonumuz
void ReShape(GLsizei width, GLsizei height)
{
if (height==0)// 0 a bolunurse
{
height=1;// boyutu 1 yap
}

glViewport (0, 0, (GLsizei) width, (GLsizei) height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//perspective izlenimimiz
gluPerspective(45.0, (GLfloat) width/(GLfloat) height, 1.0, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}
[/c]

kupumuzun cizimi icin olusturdugumuz fonksiyonumuzu yaziyoruz.

[c language=”++”]
void kup(int color,int a, int b, int c , int d)
{
glColor3fv(colors[color]);
glBegin(GL_POLYGON);
glVertex3fv(vertices[a]);
glVertex3fv(vertices[b]);
glVertex3fv(vertices[c]);
glVertex3fv(vertices[d]);
glEnd();
}
[/c]

ve sag,sol,yukari,asagi hareketleri icin kameramizi olusturuyoruz.

[c language=”++”]
// Kameramiz icin donus ve hareket methodlarimizi ekledik
void kamera()
{
glTranslatef(hareketX, hareketY, hareketZ);
}
[/c]

cizim fonksiyonumuzu olusturduk.

[c language=”++”]
//Ana Cizim fonksiyonumuz
void RenderDisplay(void)
{
//Cizimden once Ekranimizi tamamen derinlik ve renk olarak temizler.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity ();
//display imize kameramizi dahil ediyoruz.
kamera();

//CIZIMLER
glPushMatrix();
// Sadece kup icin ayarladigimiz
// Konum ve donus kordinatlarimiz
glTranslatef(0.0,0.0,-10.0);
glRotatef(60.0, 0.0, 1.0, 1.0);
//komutlarimizla kupumuzu donduruyoruz.
glRotatef(dondurY, 0.0, 1.0, 0.0);
glRotatef(dondurX, 1.0, 0.0, 0.0);
//kupumuzun yuzleri
kup(2,0,3,2,1);
kup(1,2,3,7,6);
kup(3,0,4,7,3);
kup(4,1,2,6,5);
kup(5,4,5,6,7);
kup(6,0,1,5,4);

glPopMatrix();

//buffer lari cevirir cizimi ekrana doker
glutSwapBuffers();
}
[/c]

Ve son olarak kameramizi hareketlendirecek klavye girislerimizi giriyoruz.

[c language=”++”]
//KeyboardFonksiyonumuz
void keyboard(unsigned char key, int x, int y)
{

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

hareketY = (hareketY + 0.2);
glutPostRedisplay();

break;
case ‘s’:

hareketY = (hareketY – 0.2);
glutPostRedisplay();

break;
case ‘a’:

hareketX = (hareketX – 0.2);
glutPostRedisplay();

break;
case ‘d’:

hareketX = (hareketX + 0.2);
glutPostRedisplay();

break;
case ‘z’:

hareketZ = (hareketZ + 0.2);
glutPostRedisplay();

break;
case ‘x’:

hareketZ = (hareketZ – 0.2);
glutPostRedisplay();

break;
case ‘q’:

dondurX = (dondurX + 2.0);
glutPostRedisplay();

break;
case ‘e’:

dondurY = (dondurY + 2.0);
glutPostRedisplay();

break;
default:
break;
}
}

[/c]

Yukarida gordugumuz klavye fonksiyonumuzda
w tusuna bastigimizda,hareketY = (hareketY + 0.2); islemini yaptirttik
yani w tusuna bastigimiz zaman Y ekseni uzerinde cismin bulundugu konumu
+0.2 (float) oraninda kaydir komutu veriyoruz.(yukari)

diger tuslarimizada islemlerimizi atiyoruz.

Sonuc olarak yarattigimiz projemizde;

Klavyeden komutlandirdigimiz tuslarimiza bastigimizda ekranda bulunan cisimlerimizi

Sag,sol,yukari,asagi yonlerde kaydiriyoruz veya kendi etraflarinda donduruyoruz.

Ders sonunda olusturdugumuz projenin .cpp kaynak dosyalarini buradan indirebilirsiniz.

ders9 // glLookAt

ders09_2  // 2.ci projemiz Translate

 

 

Leave a Reply

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