5 - realtime programlamaya giriş = vertex, line, poligon

5 - realtime programlamaya giriş = vertex, line, poligon

chrome_nickel

yukardaki sabit konulardan chromiGL r1.0´ı indirin.
ChomiGL´de main.cpp´de en alta doğru bulunan SahneCiz fonksiyonu, opengl motorumuzun render sırasında kullanılacak sahnenin içeriğinin bulunduğu fonksiyon olacak.
aşağıdaki örnek kodlarımızı bu fonksiyonun içine yazmamız gerekiyor.

3d ortamımızda nesneleri tanımlamak için vertexler, line´lar ve poligonlar belirlemeliyiz. bildiğiniz üzere bütün 3d kütleler, vertexlerden edge ( segment ) ve poligonlardan oluşuyorlar.

o halde opengl ile vertex, segment ve poligon çizdirebiliyor olmamız gerekir değil mi?

opengl´de 3d kütleleri glBegin(GL_KUTLETIPI) fonksiyonu ile başlatıyoruz. ve glEnd() fonksiyonu ile bitiriyoruz.
glBegin ve glEnd arasına yazacağımız tanımlar, GL_KUTLETIPI ile belirttiğimiz tipte 3d kütlenin oluşmasını sağlarlar.
3d kütleler temelde vertex bağlantıları ile tanımlandığından, glBegin ve glEnd arasında vertexler tanımlarız.

bir vertex tanımlamak için glVertex3f(x_koordinati, y_koordinati, z_koordinati); fonksiyon kalıbı kullanılıyor.


bir örnek :

glBegin(GL_POLYGON);
glVertex3f(-2.0, 2.0, 0.0);
glVertex3f(-2.0, 0.0, 0.0);
glVertex3f(2.0, 0.0, 0.0);
glVertex3f(2.0, 2.0, 0.0);
glEnd();

bu tanımda, poligon çizdiriyoruz (GL_POLYGON). ve dört tane vertex tanımladık. glEnd fonksiyonu da poligonu bitirdi. poligon tanmlamak için vertex kısıtlamanız yok. istediğiniz kadar vertex´e sahip olabilir.
işte çizdirebileceğimiz 3d kütlelerin listesi

GL_POINTS = tek başına bir vertex, nokta

GL_LINES = bağımsız düz çizgi ( tanimladigimiz her iki vertex´ten bir line geçer, iki line çizdirmek için dört vertex tanımlamamız gerekir, 3 line çizdirmek için 6 )

GL_LINE_STRIP = birbirine bağlı düz çizgi ( tanimlanmis bi onceki vertex ile bi sonraki arasina line cizer, yani 3 line cizmek icin 4, 10 line cizmek icin 11 vertex tanimlamaniz gerekir.)

GL_LINE_LOOP = kapalı bağlı düz çizgi ( line_strip ile aynı. ancak bunun başlangıcı ve bitişi otomatik kapatılır.

GL_TRIANGLES = tanımladığınız her 3 vertex, bir üçgen çizdirir. bu üçgenler birbirinden bağımsızdırlar. iki üçgen çizdirmek için 6 vertex tanımlamalısınız.

GL_TRIANGLE_STRIP = tanımladığınız her vertex, en son tanımlanan iki vertex´ten itibaren üçüncü poligonu çizdirir. iki üçgen çizdirmek için 4 vertex tanımlamalısınız. ama 10 üçgen çizdirmek için 12 vertex tanımlamalısınız.

GL_TRIANGLE_FAN = line_loop gibi, il vertex´le son vertex arasında kapalı bir üçgen oluşacak şekilde üçgenler çizer.

GL_QUADS = üçgen yerinde 4´gen çizer. tanımladığınız her dört vertex, bir dörtgen çizecektir. iki dörtgen için 8 vertex tanımlamalısınız.

GL_QUAD_STRIP = tanımladığınız ilk dörtgenden sonra her iki vertex, yeni bir dörtgen oluşmasını sağlayacaktır. tek dörtgen için 4, iki dörtgen için 6, üç dörtgen için 8, 4 dörtgen için 10 vertex gerekir.

GL_POLYGON = karmaşık geometrili poligon, bununla istediğiniz kadar kenar/köşe sayısına sahip poligon çizdirebilirsiniz. glBegin ve glEnd arasına tanımlayacağınız her vertex, bu poligonun bir köşesi olarak tanımlanır.

örneğin şu aşağıdaki tanım, yukarı bakan bir ok şeklinde poligon çizdiricek,
glBegin(GL_POLYGON);
glVertex3f(-2.0f,4.0f,0.0f);
glVertex3f(-2.0f,0.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(2.0f,4.0f,0.0f);
glVertex3f(4.0f,4.0f,0.0f);
glVertex3f(0.0f,8.0f,0.0f);
glVertex3f(-4.0f,4.0f,0.0f);
glEnd();


aşağıdaki tanım ise, aynı şekli, line ile çizicek
glBegin(GL_LINE_LOOP);
glVertex3f(-2.0f,4.0f,0.0f);
glVertex3f(-2.0f,0.0f,0.0f);
glVertex3f(2.0f,0.0f,0.0f);
glVertex3f(2.0f,4.0f,0.0f);
glVertex3f(4.0f,4.0f,0.0f);
glVertex3f(0.0f,8.0f,0.0f);
glVertex3f(-4.0f,4.0f,0.0f);
glEnd();


istediğimiz kadar kütleyi kombine ederek, istediğimiz şekli çizdirebiliriz.
veya, bu glBegin ve glEnd fonksiyonlarını, sürekli kendini tekrar eden bir döngü içine bağlayıp, içini okuyabildiğimiz bir 3d dosyasından poligon ve vertex bilgilerini alarak sahnemize istediğimiz bir 3d kütleyi bir 3d dosyasının içinden çağırabiliriz. mesela .max dosyasını okutmayı başarabilseydik, max´de çizdiğimiz 3d objeleri aynen opengl motorumuza aktarabilirdik. .max dosyasını okutmak her ne kadar epey zahmetli de olsa, daha kolay formatlar var. onlardan zaten dosya çağıracaz.

şimdi bu bilgiler ışığında size ödev, GL_POLYGON ve GL_LINE_LOOP ile bir yıldız çizin. bir artı işareti çizin ve bir de F harfi çizin.

2006-08-27 23:50:34