15 Nisan 2014 Salı

Koordinat sistemi

Koordinat sistemi

Bir pencere oluştururken pencerenin enini boyunu başlangıç noktasını belirlemekteyiz örnegin
(x,y,width,height)

bu sistem pencere oluşturmak için kullanılan koordinat sistemidir başlangıcı ekranın sol üst köşedir
x,y koordinatları ile başlangıç noktaları,
width,height ise pencerenin boyutunu belirler ,aynı işlemi pencerenin içini iç bölümünü kullanabilmek
içinde kullanabiliyoruz,opengl de bu işlem için belirlenen komut glViewport() komutudur tanımı şu şekildedir

void glViewport( GLint x,GLint y,GLsizei width,GLsizei height)

Kullanımıda


glViewport(x,y,width,height)




opengl de tanımlanan bu komut ile oluşturulan koordinat sistemi diger koordinat sisteminlerinden farklı olarak
başlangıç noktası sol alt köşedir.



Bu kordinat sistemi sayesinde pencerenin her hangi bir köşesine bir kutu başka bir köşesine üçgen vs.. gibi avantajlar saglamaktadır örnegin 3d programlara has bir özellik olan 4 farklı pencere sistemi vardır ve bu 4 pencere çizilen nesnenin top,left,perspective,front gibi pencere bakış acıları saglayan pencere sitemine sahiptir




pencerenin farklı köşelerinde farklı işlemleri gercekleştirmek size bazı avantajlar saglaya bilir bu tür bir şablon oluşturmadan önce glViewport un programımızda nasıl kullanıldıgını görelim

glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glVertex2f(0.4f,-0.4f);
glVertex2f(-0.4f,-0.4f);
glEnd();

bu kodu derlediginiz zaman alacagınız çıktı, pencerenin tam ordatısında içi boş bir kare olacaktır burada bir koordinat sistemi belirlenmedigi için opengl mekanizması bunu pencerenin tam ortasına odaklamaktadır aynı işlemi şu şekilde yaparsak

glViewport(0,0,200,200);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glVertex2f(0.4f,-0.4f);
glVertex2f(-0.4f,-0.4f);
glEnd();

pencerenin sol alt köşesinde içi boş bir kare elde ederiz buna nasıl ulaştık diye bir soru aklınızda belire bilir
glViewport tanımı yapıldıktan sonra glViewport içinde verilen koordinatlar çizilecek nesnenin pencere içersinde hangi noktadan başlayıp hangi noktada bitecegi ve o noktalar arasında genişligi ve boyutunun ne kadar oldugunu belirtir tabi burada pencerenin boyutuda önemlidir ben pencere yi oluştururken width=400 height=400 degerini atadım

glViewport un tanımına baktıgımız zaman
glViewport(x,y,width,height)
glViewport(0,0,200,200);

x=0
y=0
width=200
height=200
degerlerini almaktadır x ve y parametrelerine atanılan deger sıfır oldugu için sıfır noktasından ve genişligi ve boyutu 200 degerinde bir alanda çizim yapılmaktadır buda ekranın sol alt bölümünde gercekleşir,bizde 3d programlardaki gibi ekranı dört ayrı pencere ye bölebiliriz
bu işleme başlamadan önce penceremizi oluşturuken width,height degerlerini 400 olarak ayarlayalım aksi taktirde yanlış sonuclar alabilirsiniz
işlemin daha belirgin olması açısından pencerenin tam ortasından dikey ve yatay iki çizgi cekerek ekranı dörde bölelim

glViewport(0,0,400,400);
glColor3f(0.0,0.0,1.0);
glBegin(GL_LINES);
glVertex2f(-1.0f,0.0f);
glVertex2f(1.0f,0.0f);
glVertex2f(0.0f,1.0f);
glVertex2f(0.0f,-1.0f);
glEnd();

bu şekilde işlemi biraz daha belirgin olmasını saglayacagız

void kare(void)
{
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glVertex2f(0.4f,-0.4f);
glVertex2f(-0.4f,-0.4f);
glEnd();
}
çizilecek kareyi fonksiyon olarak tanımlaya biliriz bu şekilde dört ayrı kare çizmeye gerek kalmaz

void pencere(void)
{    
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
//sol alt
glViewport(0,0,200,200);
kare();
// sag alt
glViewport(200,0,200,200);
kare();
//üst sol
glViewport(0,200,200,200);
kare();
//üst sag
glViewport(200,200,200,200);
kare();
glFlush();
}
programı derlediginiz zaman alacagınız sonuç şu şekilde olacaktır



gördügünüz gibi her bir glViewport tanımı pencerenin farklı bölgelerinde aynı çizimi yapıyoır ve bunlar bir birinden bagımsız bir şekilde işliyor ,bu işlemler biraz pratige dayalı işlemler bir kaç farklı işlem gercekleştirerek daha iyi kavraya bilirsiniz.


Hiç yorum yok:

Yorum Gönder