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ı :
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();
}
Kaydol:
Kayıtlar (Atom)