17 Nisan 2013 Çarşamba

Opengl ile Nokta Oluşturma


#include <GL/glut.h>
#include <gl/GLU.h>
#include <gl/GL.h>

void myinit()
{
    glClearColor(1.0,1.0,1.0,1.0);
    glShadeModel(GL_FLAT);
}
void display () {

    /* pencereyi temizle */
    glClear(GL_COLOR_BUFFER_BIT);

    /* şekli çiz */
    glColor3f(1.0,0.0,0.0);
    glBegin(GL_POINTS);
        glVertex2f(0.5,0.5);  // Birden fazla nokta oluşturmak için glVertex2f fonksiyonunu
    glEnd();                       // buraya ekleyin

    /* görüntüyü çiz */
    glFlush();
}

int main ( int argc, char * argv[] ) {
       
    /* GLUT'u başlat */
    glutInit(&argc,argv);

    /* Pencerenin başlangıç pozisyonu, boyutu ve özelliklerini ayarlıyoruz */
    glutInitWindowSize(500,500);
    glutInitWindowPosition(0,0);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    
    /* Yeni bir pencere oluşturuyoruz */
    glutCreateWindow("Nokta");

    myinit();

    glutDisplayFunc(display); // görüntüleme fonksiyonu
    
    glPointSize(3.0); // nokta büyüklüğünü ayarlıyoruz

    /* glut olaylarını çalıştır */
    glutMainLoop();
}

Opengl ile Kare Çizimi



GLsizei wh=500,ww=500; // Pencerenin başlangıç pozisyonu
GLfloat size=50.0; // Karenin kenar uzunluğu
int x=10,y=10; 

/* Kareyi Çiz */
void drawSquare() 
{
    y=wh-y;
    glColor3f(0.0,0.0,1.0); // Karenin rengini belirliyoruz - Mavi
    glBegin(GL_POLYGON);
       glVertex2f(x+size,y+size);
       glVertex2f(x-size,y+size);
       glVertex2f(x-size,y-size);
       glVertex2f(x+size,y-size);
    glEnd();
    glFlush();
}

/* Yeniden şekillendiğinde ne olacak */
void myReshape(GLsizei w, GLsizei h)
{
    /* matris işlemlerini yap */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    /* arkaplan rengi ve bakış açısını ayarla */
    glViewport(0,0,w,h);
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
    /* Pencere boyutlarını yeniden yapılandırıyoruz */
    ww = w;
    wh = h;
}
/* Uygulama başlatıldığında birtakım ayarlamalar yapıyoruz */
void myinit(void)
{
    glViewport(0,0,ww,wh);
    /* Pick 2D clipping window to match size of screen window
    This choice avoids having to scale object coordinates
    each time window is resized */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, (GLdouble) ww , 0.0, (GLdouble) wh , -1.0, 1.0);
    /* Arkaplanı siyah olarak ayarlıyoruz ve pencereyi temizliyoruz */
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
    /* Reshape callback fonksiyonu */
    glutReshapeFunc(myReshape);
}
/* Fare tıklanınca ne olacak */
void mouse(int btn, int state, int x, int y)
{
    if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) 
        exit(btn); // Pencereyi kapat
}
/* Ana Program */
void main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("square");
    myinit ();
    glutReshapeFunc (myReshape);
    glutMouseFunc (mouse);
    glutDisplayFunc(drawSquare);
   
    glutMainLoop();
}

16 Nisan 2013 Salı

Opengl ile Menü Oluşturma

GLUT kütüphanesi ,interaktif kontrol için pop-up menü fonksiyonları sağlar. Şimdi bu fonksiyonları sırasıyla görelim.

glutCreateMenu(menu_callback_func):

Adından da anlaşılacağı üzere yeni bir menü oluşturmamızı sağlıyor. menu_callback_func callback fonksiyonumun adı. Siz farklı bir ad verebilirsiniz. 


void menu_callback_func ( int ID )
{
   
}

Callback fonksiyonumuz yukarıdaki formatta olacak. Herhangi bir değer döndürmüyor. (Yani void) Ayrıca bir adet int türü parametre alıyor. ID değeri menüye ait elemanların id değeridir.

Örnek :  

if(ID == 0)
   exit(0);

Yukarıdaki gibi bir kod farenin ilişkili butonuna tıklandığında ilgili id değerine (mesela çık) basıldığında pencereyi kapatır. Siz de buna benzer komutlar yazabilirsiniz.


glutAddMenuEntry ( const char *label, int value ): Menüye yeni eleman ekliyor.

- label: Menü biriminin kullanıcıya gösterilen ismidir.
- value: Bu birim seçildiğinde ID’si , menü callback fonksiyonuna gönderilir.

Örneğin : glutAddMenuEntry("Kopyala",0);
glutAddMenuEntry("Kes",1);



glutAttachMenu ( int button ): 

button: Menu ile hangi fare butonu ilişkilendirileceği belirleniyor. Aşağıdaki enum değerlerden birini parametre kısmına eklemelisiniz.

GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON

glutAddSubMenu( const char *label, int value ): Menü içerisinde alt menüler oluşturur.

Böyle bir alt menü oluşturmak için şöyle bir ifade kullanabilirsiniz:

int deneme = glutCreateMenu(menu);
glutAddSubMenu("Kategori adı", deneme);

Örnek menü programı : 


    int shrinkMenu = glutCreateMenu(processShrinkMenu);
    glutAddMenuEntry("Shrink",0);
    glutAddMenuEntry("NORMAL",1);

    int fillMenu = glutCreateMenu(processFillMenu);
    glutAddMenuEntry("Fill",3);
    glutAddMenuEntry("Line",4);

    int colorMenu = glutCreateMenu(processColorMenu);
    glutAddMenuEntry("Red",5);
    glutAddMenuEntry("Blue",6);
    glutAddMenuEntry("Green",7);
    glutAddMenuEntry("Orange",8);

    int mainMenu = glutCreateMenu(processMainMenu);
    glutAddSubMenu("Polygon Mode", fillMenu);
    glutAddSubMenu("Color", colorMenu);

    // menüyü farenin sağ tuşuna ilişkilendir
    glutAttachMenu(GLUT_RIGHT_BUTTON);

Programı çalıştırıp pencere üzerinde farenizin sağ tuşuna tıklarsanız aşağıdaki gibi bir ekranla karşılaşırsınız.

Ekran çıktısı : 






Opengl Uçan Çaydanlık Animasyonu c++


#include <GL/glut.h>


double x, y, z;           // mevcut çaydanlık pozisyonu (main'de başlatılıyor)

/* Görüntüleme fonksiyonu */
void display () {

    /* Pencereyi temizle */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Transform martisi türünü belirle */
    glMatrixMode(GL_MODELVIEW);

    /* Görüntüyü çiz */
    glPushMatrix();
    glTranslatef(x,y,z);
    glutWireTeapot(.5);
    glPopMatrix();

    /* OpenGL fonksiyonlarını sınırlı sürede çalışmaya zorlar */
    glFlush();
}
/* Animasyon fonksiyonu */
void animate () {

    /* Durum değişkenlerini güncelle */
    x += .001;
    y += .001;
    z -= .001;

    /* ekranı yenile */
    glutPostRedisplay();
}

void reshape ( int width, int height ) {

    /* viewport transformasyonunu tanımla */
    glViewport(0,0,width,height);

}

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

    /*  GLUT'u ilgili parametreleri kullanarak başlat */
    glutInit(&argc,argv);

    /* setup the size, position, and display mode for new windows */
   /* boyut, pozisyon ve görüntüleme modu için yeni pencereleri ayarla */
    glutInitWindowSize(500,500);
    glutInitWindowPosition(0,0);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);

    /* Uçan Çaydanlık başlında yeni bir pencere oluştur */
    glutCreateWindow("Uçan Çaydanlık");
    glutDisplayFunc(display);  // görüntüleme fonksiyonu
    glutReshapeFunc(reshape);   // pencerenin boyutu değiştiğinde meydana gelir.
    glutIdleFunc(animate);  /* boş fonksiyon yani herhangi bir olay meydana gelmediğinde oluşur animasyonlarda etkilidir */

    /* depth-buffering */
    glEnable(GL_DEPTH_TEST);

    /* Projeksiyon transformasyonunu tanımla */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0,1.0,-1.0,1.0,.5,3.0);

    /* görüntüleme transformasyonunu tanımla */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);

    /* durum değişkenlerine başlangıç değerlerini ata (çaydanlık pozisyonu) */
    x = 0;
    y = 0;
    z = 0;

    /*  GLUT'u olayları bekletmek için çağırır */
    glutMainLoop();
}