• Merhaba Ziyaretçi.
    "Yapay Zeka Objektif " Fotoğraf Yarışması başladı. İlgili konuya  BURADAN  ulaşabilirsiniz. Sizi de bu yarışmada görmek isteriz...

C dili ile OpenGL Programlama

biz

Aktif
devamlı OpenGL game diye bir virüs sinyali alıyordum. windefender den en sonunda format attım bu programla bir ilgisi varmıdır.
 

biz

Aktif
devamlı OpenGL game diye bir virüs sinyali alıyordum. windefender den en sonunda format attım bu programla bir ilgisi varmıdır.
 

merakettim

Homo Sapiens Sapiens
Özel üye
Geldik gelecek yazımıza:) (Biraz geç oldu lakin kusuruma bakmayın).

PHP:
#include <GL/glut.h>
#include <math.h>//matematik fonksiyonlarının barındığı kütüphane
float nokta;

void ciz(void)
{  
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);//GL_POLYGON olmassa olmaaaaaaaaaaaaz(Bence:))
    glColor3f(1,0,0);//renk belirtiyoruz(kırmızı)
    for(nokta=0;nokta<8;nokta=nokta+0.1)//basit harmonik hareket yapabilmemiz için kontrol değerleri üreticimiz:)
    {//döngüde
    glVertex2f(cos(nokta),sin(nokta));//basit harmonik hareket denklemimiz
    }//döngü bitti
    glEnd();
    glFlush();
}  

int main(int argc, char *argv[])
{     

    glutInit(&argc, argv); 
    glutInitWindowSize(400,400);
    glutCreateWindow("Dolu pencere\"iki boyutlu\"");
    glutDisplayFunc(ciz); 
    glutMainLoop(); 

    return 0;
}

Programı anlatmaya başlamadan önce biraz laf kalabalığı yapayım.
Konumuz,en başta dediğim gibi üç nokayı birbirine bağlayıp,için renklendiren GL_POLYGON.Bu basit ve sıradan görünen parametre sabiti okadar işinize yarayacakki en büyük çizimlerinizden tutun da en küçük rutuşlarınıza kadar kullanacaksınız.
Bu sabit aslında sadece üç noktayı birleştirmez.Bütün noktaları sırası ile birleştirir.En son olarak da ilk nokta ve son noktayı birleştirir.Böylelikle bir daire noktaları çizildiğinde,bu noktaları birleştirmek için bu sabit kullanılır.

Programa geçecek olursak aslında farklı bir fonksiyon kullanmadık.Yaptığımız iş sadece daire oluşturacak noktalar türetmek ve bu noktaları birleştirmek.

*Gelecek yazıda 3 boyutlu çizime geçeceğiz.
 

merakettim

Homo Sapiens Sapiens
Özel üye
Gine geldik bir sonraki yazımızaaaaaaaaaaaaaa.
3 boyutlu çizime geçmekden vazgeçtim arkadaşlar.Biraz daha olaya artaksyon katalım,üçüncü boyutun keyfini daha güzel sürelim dedim.Yeni konumuz "çift tampon kullanmak"."Yav bilader çift tampon kullanacaz da başımız göğe mi erecek?" diyebilirsiniz.Çift tampon kullanımı bize süreklilik sağlayan ve pencereye basılan görüntüdeki üçgen,beşgen,yüzgen v.s. çizimlerimizi hareket ettirmemizi sağlayacak.Mantığımız şu:İki tamponumuz var.Birine "Display" diyelim,diğerine ise "Idle" diyelim.Şimdi bu iki tamponumuzdan Display isimli olan pencereye şekiller basacak ve sıra Idle tamponumuza geldiğinde Display tamponu şekilleri değiştirecek ve tekrar sıra Display tamponumuza gelecek.Dipslay gine şekilleri basacak.Idle sistemi oyalarken Display pencereye basacaklarını değiştirecek ve sıra geldiğinde(Display'a)değiştirdiği şekilleri basacak.Idle sadece oyalama işi yapacak.Belki biraz anlatım karışmış olabilir ama benim gibi "merak etmeye" devam ederseniz çözersiniz olayı.

Birazdan vereceğim örnek programla ne demek istediğimi daha iyi anlayacaksınız.

Örnek programa geçmeden önce biraz daha hikaye okuyayım sizlere.
Hani dedik ya "çift tampon kullanarak üçgeni v.s. hareket ettireceğiz" diye.Hatırladınız mı??"Eeeeeeeveeeeeeet:)".Tamam ama biz bu şekilleri nasıl hareket ettireceğiz?
Gel gelelim döndürme işlemine.

void glRotatef(float açı,float x,float y,float z);

Şeklimiz,açı kadar ve x,y ve z ile belirlenen noktaların etrafında döndürülür.

Öteleme olayı ise belirlenen kordinatlara şeklimizi ötelemeyi sağlar.
Misal:1,1 kordinatlarında bir üçgenimiz var.Biz tutup glTranslatef(-1,-1,0); eklersek eğer üçgenden önce,üçgen (1+(-1)) formülünden 0,0 kordinatlarına ötelenecektir.

void glTraslatef(float x,float y,float z);
x,y,z ile belirlenen kordinatlara şekili ötele.

Şekillerimizi büyültüp küçültelim birde.
void glScalef(float x,float y,float z);
x ekseninde işlem için x'e değer veririz,y ve z de aynı gine.
Değer 1'den küçükse şeklimiz küçülür,1'den büyükse büyülür,1 etkisiz(ön tanımlı) değerdir.


Bu konu ile ilgili anlatacaklarım bu kadar.Örnek programdan sonra daha iyi anlayacaksınız.

Şimdi çift tampon meselesine geri dönelim."Nasıl çift tampon kullanacam?" dediğinizi duyar gibiyim.

Çİft tampon kullanmak için,iki adet tampon fonksiyonu belirlememiz lazım.
Birincisini biliyorsunuz zaten:
glutDisplayFunc
Bu fonksiyon belirtme fonsiyonumuz bize pencereye şekil basmaya yarayan Display tanponumuzun bağlı olduğu fonsiyonu gösteriyor.
Arka tampona geçmeden evvel "glFlush()" yerine artık "glutSwapBuffers()" kullanacağız.

Bir de arka tamponumuz var.

void glutIdleFunc (çağıracağı fonksiyon adı)
void arkatampon (void);
Arkatampon yerine istediğinizi yazabilirsiniz lakin aynı isimle çağırmalısınız.Bu fonksiyonun içerisinde herhangi birşey yazmanız gerekmez sadece sonuna "glutPostRedisplay();" eklemeniz gerek.Anladığım kadarıyla bu fonksiyon "ben sıramı savdım,sıra sende Display kardeş" diyo.

glut kütüphanesine birkaç istek daha bildirdikmi olat tamamdır.

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA)

Burada dedikki "Eey glut kütüphanesinin engiiiiiin pencereye şekil basma türleriiiii,biz projemizde çift tampon (GLUT_DOUBLE) ve kırmızı(Bizim "-KıRMıZı-" değil:P),yeşil,mavi ve saydamlık(alpha) (GLUT_RGBA) kullanacağız.(Pencere oluşturmadan önce kullanmanız tarafımdan tavsiye olunur:))
Ha unutmadan bir de glLoadIdentity() var.

Bu fonksiyon,şeklimize etki eden her etkenin kaldırılmasını sağlar.
Gelecek yazıda bundan daha çok bahsedeceğim:)
Geldik örnek programa........



Buyrun efendim:P:

PHP:
#include <GL/glut.h> 
#include <math.h>
float aci=0;//açı belirledik

void ciz(void) 
{   
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();//kimliğe dön
    glTranslatef(0.5,0,0);//ötele
    glRotatef(aci,0,0,1);//döndür
    glScalef(0.5,0.5,0.5);//küçült
    glColor3f(1,0,0);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5,0.5);
    glVertex2f(0.5,0.5);
    glVertex2f(0.5,-0.5);
    glVertex2f(-0.5,-0.5);
    glEnd();
    glutSwapBuffers(); //arka tampona geç
}   
void arkaciz(void)
{
     aci+=.1;//açı her döngüde artsın (0.1 kadar)
     glutPostRedisplay();//sıra ön tamponda
}     

int main(int argc, char *argv[]) 
{      

    glutInit(&argc, argv);  
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);// eeeeeey glut:D
    glutInitWindowSize(400,400); 
    glutCreateWindow("Çift Tampon Örneği\"");

    glutDisplayFunc(ciz); //ön tampon belirle
    glutIdleFunc(arkaciz);//arka tampon belirle
 
    glutMainLoop();  

    return 0; 
}
 

merakettim

Homo Sapiens Sapiens
Özel üye
3. BOYUT

PHP:
#include <GL/glut.h>  
#include <math.h> 
float aci=0;

void ciz(void)  
{    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //derinlik temizleme sabitini de ekliyoruz GL_DEPTH_BUFFER_BIT
    glLoadIdentity();
    glTranslatef(0.5,0,0);
    glRotatef(aci,1,0,1);//x ekseni ve z eksenlerinde döndürüyoruz
    glScalef(0.5,0.5,0.5);
    glColor3f(1,0,0); 
    glBegin(GL_POLYGON);
     
    glVertex3f(-0.5,0.5,0); //fazladan z(derinlik noktası koyduk glVertex3f(x,y,z)
    glVertex3f(0.5,0.5,0); 
    glVertex3f(0.5,-0.5,0); 
    glVertex3f(-0.5,-0.5,0); 
    
    glEnd(); 
    glutSwapBuffers();
}    
void arkaciz(void) 
{ 
     aci+=.1;
     glutPostRedisplay();
}      

int main(int argc, char *argv[])  
{       

    glutInit(&argc, argv);   
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);//derinlik kullanmak için GLUT_DEPTH  ekledik
    glutInitWindowSize(400,400);  
    glutCreateWindow("\"3. Boyut\""); 

    glutDisplayFunc(ciz);
    glutIdleFunc(arkaciz);
  
    glutMainLoop();   

    return 0;  
}



3 boyutlu şekiller için 3 değişiklik yaptık önceki programda.

"glutInitDisplayMode" fonksiyonu aracılığı ile,GLUT_DEPTH sabiti ile,derinlik kullanacağımızı söyledik(z koordintlarını).

"glClear" fonksiyonu ile ve GL_DEPTH_BUFFER_BIT sabiti ile derinliği temizlettik.

ve son olarak da glVertex2f yerine,bu fonksiyonun 3 boyutlu şekillerde kullanılan türevi glVertex3f(x,y,z) kullandık.Ve artık 3 boyutlu bir çizim yapmış olduk:)


3 boyut meselesinden sonra gelecek yazıda kutu oluşturacağız.yavaş yavaş keyiflenmeye başlayacak iş;)

Moral motivasyon amacı ile küçük bir proje. ;)
 

merakettim

Homo Sapiens Sapiens
Özel üye
Aaaa bu güzel yazı dizisini ortalıkta bırakmışım. Ben burdan yürürüm. Biraz gelişsin, bi indeks rica edicem ;)
 

merakettim

Homo Sapiens Sapiens
Özel üye
Daha önceki örneklerde hep GL_POLYGON kullanmışız fakat artık hep (neredeyse hep) GL_TRIANGLES kullanacağız. GL_TRIANGLES verilen üç noktadan bir üçgen oluşturmamızı sağlar. Tüm şekiller de üçgenden meydane gelir. Dert etmeyin ilerde MS3D dosyalarını nasıl alacağımızı gösterirken bana hak vereceksiniz.

Gerekli olanlar:

8 adet nokta
12 adet üçgen
36 adet glVertex3f

36 tane glVertex3f bak buraya dikkate et. Alt tarafı kutu çizecem. 36 diyo bak. Üşenmedim 36 tane glVertex yazdım. 8 tane kıytırık noktayı 36 kez yazdım düşün. İnsan gibi değil.

Bakın şu örneğe.

PHP:
#include <GL/glut.h>
#include <stdlib.h>


static void
resize(int width, int height)
{
    const float ar = (float) width / (float) height;
   
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
   
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void
display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double aci = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
     glTranslatef(0,0,-5);
    glRotatef(aci,1,0,1);//x ekseni ve z eksenlerinde döndürüyoruz
    glScalef(0.5,0.5,0.5);
    glColor3f(1,0,0);
   
   
    //GL_TRIANGLES verilen noktalardan üçgen oluşturur
   
    //36 tane glVertex3f
    glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);

glColor3f(1,0,1);
glVertex3f(1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);

glColor3f(1,1,0);
glVertex3f(1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);

glColor3f(0,1,0);
glVertex3f(1.0f, 1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);

glColor3f(0,1,1);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);

glColor3f(1,0,0.5);
glVertex3f(1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);

glColor3f(1,0.5,0);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(1.0f,-1.0f, 1.0f);

glColor3f(1,0.5,0.5);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f, 1.0f,-1.0f);

glColor3f(0.5,0,0);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f,-1.0f, 1.0f);

glColor3f(0.5,0,1);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);

glColor3f(0.5,1,0);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);

glColor3f(0.5,0.5,0.5);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(1.0f,-1.0f, 1.0f);
   
    glEnd();

    glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;
    }

    glutPostRedisplay();
}

static void
idle(void)
{
    glutPostRedisplay();
}


int
main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("3B Kutu");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

   

    glutMainLoop();

    return EXIT_SUCCESS;
}

1.jpg
 
Top