BG PDF 15 2

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

Hafta 14

3-Boyutlu Modellere devam


Şimdi 3B iki cisim çizelim ve döndürelim:

#include <GL/glut.h>
GLfloat aciPiramit = 0.0f; // Pramitin dönme açısı (GLfloat-->GL'in kendi float'ı )
//float aciPiramit=0.0;
GLfloat aciKup = 0.0f; // Kübün dönme açısı
int t_yenileme = 20; // milisaniye cinsinden yenileme aralığı

/* Kendi OpenGL Grafik ayarlarımızı yapalım */


void Ayarlar() {
glClearColor(0.0f, 1.0f, 1.0f, 1.0f); /* opaque bir yeşil-mavi. Penceremizin arka alan
rengidir; aslında ekranın hangi renkle temizleneceğini belirtir.*/
glClearDepth(1.0f); /*glClearDepth fonksiyonunu 1.0 değeri ile çağırarak derinlik
tamponunun temizlenmesini sağlıyoruz. 1.0 ile Arka plan derinliğini en uzağa ayarlanıyor*/
glEnable(GL_DEPTH_TEST); //z-ekseni için derinlik testi
/* Derinlik testinin yapılabilmesi için GL_DEPTH_TEST sembolik sabitini, glEnable fonksiyonuna
parametre olarak geçerek çağırıyoruz.*/
glDepthFunc(GL_LEQUAL); // Karmaşık grafiklerde Derinlik testi için kullanılır:
/*Daha sonra glDepthFunc fonksiyonu ile derinlik testinde kullanılacak fonksiyonu belirtiyoruz.
Burada parametre olarak geçilen GL_LEQUAL sembolik sabitinin belirttiği derinlik testi
fonksiyonu, o an gelen z değeri, tamponda saklanan z değerine eşit ise veya ondan daha küçükse
başarılı olur.*/
glShadeModel(GL_SMOOTH); // karmaşık grafiklerde Düzgün gölgelendirmeyi etkinleştirir
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /* karmaşık grafiklerde perspektif
ayarlamalarını(düzeltmelerini) yapar.*/
}

/* Pencere yeniden boyama fonksiyonu oluşturuyoruz. Pencere ilk görüntülendiğinde ve pencerenin


yeniden boyanması gerektiğinde çağrılır. */
void CizimFonksiyonu()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* belirli bir bellek tamponunu veya
tampon bileşenlerini silmek icin kullanilmaktadir.Tampon ile kastimiz bellekte ki bir is icin
ayrılmış belirli bir hafiza parcasidir. Bir cizimin kirmizi,yesil,ve mavi bileseleri renk tamponu
ve ya piksel tamponu olarak adlandirilir.*/
glMatrixMode(GL_MODELVIEW); /* Kameranın pozisyonu ve cisimlerin 3D geometrisi ile ilgili
çizme, görüntüleme, konumlandırma ve yönlendirme işlemlerinden önce matrislerin hangi işlem için
düzenleneceği belirtilmelidir: bu örnekte -->model-view matrisi kulanılıyor*/

// piramit için 4 üçgen lazım


glLoadIdentity(); // Orjinal Duruma dönülür (Reset)
glTranslatef(1.5f, 0.0f, -6.0f); // sola ve geriye ötele
glRotatef(aciPiramit, 1.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES); // piramit için 4 üçgen lazım

// Ön
glColor3f(1.0f, 0.0f, 0.0f); // Kırmızı
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // Yeşil
glVertex3f(-1.0f, -1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f); // Mavi
glVertex3f(1.0f, -1.0f, 1.0f);

1
// sağ
glColor3f(1.0f, 0.0f, 0.0f); // Kırmızı
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); // Mavi
glVertex3f(1.0f, -1.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f); // yeşil
glVertex3f(1.0f, -1.0f, -1.0f);

// arka
glColor3f(1.0f, 0.0f, 0.0f); // Kırmızı
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // Yeşil
glVertex3f(1.0f, -1.0f, -1.0f);
glColor3f(0.0f, 0.0f, 1.0f); // Mavi
glVertex3f(-1.0f, -1.0f, -1.0f);

// sol
glColor3f(1.0f, 0.0f, 0.0f); // Kırmızı
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); // Mavi
glVertex3f(-1.0f, -1.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f); // Yeşil
glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd(); // Piramit çizimi bitti

// Kenarları Farklı renklerde olan renkli küp yapalım


glLoadIdentity(); // Orjinal Duruma dönülür (Reset) (Reset model-view matrix)
glTranslatef(-2.0f, 0.0f, -7.0f); // şekli sağa ve geriye kaydır
glRotatef(aciKup, 1.0f, 0.0f, 0.0f); // Rotate (1,0,0)-axis (x-ekseni etrafında dönüş)
glBegin(GL_QUADS); // Küp için 6 kare-yüz lazım
// üst yüz (y = 1.0f)
// köşeleri saat yönünün tersine sıralayacağız

glColor3f(1.0f, 0.0f, 1.0f); // pembe


glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);

// Alt yüz (y = -1.0f)


glColor3f(1.0f, 0.5f, 0.0f); // Turuncu
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);

// Ön yüz (z = 1.0f)
glColor3f(0.0f, 0.0f, 1.0f); // Mavi
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

// Arka yüz (z = -1.0f)


glColor3f(1.0f, 1.0f, 0.0f); // SArı
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);

2
// sol yüz (x = -1.0f)
glColor3f(1.0f, 0.0f, 0.0f); // Kırmızı

glVertex3f(-1.0f, 1.0f, 1.0f);


glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);

// sağ yüz (x = 1.0f)


glColor3f(0.0f, 1.0f, 0.0f); // Yeşil
glVertex3f(1.0f, 1.0f, -1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glEnd(); // Renkli küp çiziminin sonu

//glflush(); -->Yetmez, glutSwapBuffers()lazım


glutSwapBuffers(); /*Çerçeveyi çizdikten sonra Ön ve arka tamponlar değişir. Burada, biri
gösterilen diğeri gizlenen, çift tampon modunda pencere kullanıyoruz. Bu durumda OpenGL
komutlarının görüntülenmesi daima gizli tampon içine yapılır. glutSwapBuffers(), çağrıldığında,
tamponları değiştokuş ederek çizileni pencere içinde görüntüler. Tercih edilmesinin nedeni,
çerçeve içeriğinin satır satır oluşumunu insan gözünden saklamasıdır*/
aciPiramit += 1.0f;
aciKup -= 0.2f;
}
void zamanlayici(int value) {
glutPostRedisplay(); //CizimFonksiyonu()'nun yaptığı işlem sonrası güncelleme için
glutTimerFunc(t_yenileme, zamanlayici, 0); // next timer call milliseconds later
}
/*pencerenin en boy oranını için: */
void GorunumAyari(GLsizei x, GLsizei y) //x:genişlik, y:yükseklik
{ // "GLsizei"(negatif olmayan tamsayı demektir. int width; diyebilirdik)
// Yeni pencerenin en boy oranını hesaplama
if (y == 0) y = 1; // 0'a bölümden korunmak için
GLfloat oran = (GLfloat)x / (GLfloat)y; //float oran; diyebilirdik

/* Genellikle pencere genişliği ile aynıdır. Eğer viewport genişlik / yükseklik oranı
projeksiyondakinden farklı ise nesneler olduklarından farklı biçimde görünebilirler*/
glViewport(0, 0, x, y);

// en boy oranını görünüm penceresiyle eşleşecek şekilde ayarlama:


glMatrixMode(GL_PROJECTION); // projeksiyon (izdüşüm) matrisi
//izdüşüm görünümüne ayarlamak için
glLoadIdentity(); // Orjinal Duruma dönülür (Reset)

// Perspectif projeksiyon yapar--> gluPerspective (theta, aspect, dnear, dfar)


gluPerspective(45.0f, oran, 1.0f, 20.0f);
//Bu fonksiyondaki theta perspektifin yaptığı dönüş açısını,
//aspect en / boy oranını,
//dnear ve dfar ise sırasıyla yakın ve uzak perspektif panellerine olan uzaklığı
vermektedir.
//0-180 arası olacak.Nesneye ne kadar yakınsak o kadar dar açı olmalı,
//ne kadar uzaksak o kadar geniş açı olmalı
//(float)en/(float)boy --> tam ekran yapıldığında bozulmasın diye
//1.0 kameranın modele(çokgene) en yakın olabileceği yer
//20.0 kameranın modele(çokgene) en uzak olabileceği yer

3
/* GLUT, main()den başlayarak bir konsol uygulaması olarak çalışır */
int main(int argc, char** argv) {
glutInit(&argc, argv); // GLUT'u başlat
glutInitDisplayMode(GLUT_DOUBLE); // çift tampon kullanma

glutInitWindowPosition(50, 50); //pencere başlangıç noktası


glutInitWindowSize(800, 600); // Pencere genişlik ve yükseklik ayarlayalım
glutCreateWindow("3-Boyutlu Sekiller"); //pencere başlığı

glutDisplayFunc(CizimFonksiyonu); // kendisine parametre olarak gönderilen CizimFonksiyonu


fonksiyonu çağırır ve çizimi yapar
glutReshapeFunc(GorunumAyari); // Eğer pencere yeniden boyutlandırılırsa yeni genişlik ve
yükseklik değerleri atanır.
Ayarlar(); // Kendi OpenGL Ayarlarımız
glutTimerFunc(0, zamanlayici, 0); // zamanlayıcı çağrımı
glutMainLoop(); // çizimi döngüye sokar.
return 0;
}

You might also like