5 Eylül 2021 Pazar

Başlarken

B A Ş L A R K E N

1966 doğumlu olup doksanlı yılların başından itibaren hobi olarak 3d animasyon ve fotoğraf düzenleme programlarıyla olan muhabbetimiz 2009 yılında yerini grafik programlamaya bıraktı.

Nereden nasıl başlamalıyız,

diye sağa sola bakarken açık kaynak paylaşımı olan opengl grafik kütüphanesive c, c++ ile başlamaya karar verdik. Sıfır bilgi ile yola çıktık. Bazen haftalar aylar hatta bir yılın üzerinde ara verdiğim zamanlar oldu. Ama sonunda merakınız yine size kaldığınız yerden başlangıç yaptırıyor. 

 Burada benim için çok değerli  bir kaynak  kitap olan 

Şerif Gözcü'nün  yazmış olduğu kitap, benim başucu kitabım olmuştur. Sıfırdan başlayan biri için Türkçe kaynağın önemini anlatmaya gerek yok sanırım. İyiki yazmışsın diyor ve kendisini buradan tüm içtenliğimle saygıyla selamlıyorum. 

Bende  edindiğim birikimimi anlatabildiğim kadarıyla paylaşmaya çalışacağım.

 Ben buradan  her biri ayrı bir hazine olan gençlerimize şunu tavsiye ederim.  Her işin bir acemilik, kalfalık ve ustalık dönemi vardır.  Araştırmaktan ve çalışmaktan bıkmayın. 

Yazılım dünyasını kısaca dâhiler, profesyoneller ve amatörler  olarak sınıflandırırsak biz amatör olarak heyecanla yola devam diyoruz.

Amacımız yediden yetmişe bu alanda ilgisi olanlara bir nebze dahi olsa faydalı olabilmektir. Gençlerimizin ufkunu açmak hedef göstermektir. 

Nerede nasıl eksiklerimiz var farkındayız. Bu adımları aşmaya çalışacağız.


Bitmiş projeler

2009 yılından günümüze uzanan zaman diliminde yapmış olduğum bazı çalışmalardan  bir kısmını sizlerle paylaşmak istiyorum.

 Bunları  projeler 1,2,3  sayfalarında bulabilirsiniz. 

Projeler 1

Bitmiş Projeler 

projeler1 

Hac ve Umre uygulaması: Bu uygulamada hac ve umreye dair bir çok bilgi ve tecrübeyi gitmeden edinmiş olacaksınız. Yada aklınızda oluşan sorulara burada yanıt bulmuş olacaksınız. 

Hac ve umre ile bilgilendirici bir uygulamadır. Bu uygulama Hac ve Umre yapılışının sade bir şekilde anlaşılması için    yapılmış olsa da DİB hazırladığı Hac ve Umre kılavuzunu esas alınız. 

Kaynak bilgi olarak TDV İslam Ansiklopedisi ve 

   TDV islam ilmihalinden özet şeklinde yararlanılmıştır. 

Uygulamayı windows masa ve diz üstü bilgisayarlarda kullanabilirsiniz.  





Hac uygulamayı indir 2.0: Hac

                               Hac uygulama indir 2.1: indir

Kolay Ezber uygulaması: Sure ve duaların kolay bir şekilde ezberlenmesine yönelik bir çalışmadır.
Sûre sayfaları DİB'nın Kur-an'ı Kerim 3.0 dan alıntı olup seslendirme İshak Danış hocamız
tarafından okunmaktadır.



Kolay ezber_1.1: indir


Projeler 2

 projeler2

Periyodik Tablo: İnsanlığın kaderine yön vermiş ve
de verecek bir tablonun karşısındayız.
Keşfedilmeyi
bekleyen nice sırlar. 


                                              P tablo indir: p_sistem



3D Slayt: 3d sanal ortamda slaytlarızı sunabilirsiniz. Farklı bir slayt sunum aracı.

 3d Slayt indir: slayt




Motor yarış oyunu: Basit bir motordan süper
 motora giden bir oyun. 

Motorunu Bio Hoca'nın servisinde geliştirebilirsin.



Teknik hocadan taktik al.



motorlar 1.6: indir

projeler3

 projeler3

KONULAR

       İÇİNDEKİLER

   1-Derleyici Kurulumu

   2-SFML

   3-opengl 

   4-Temel Pencereler

   5-Mouse Kontrolleri

   6-Klavye Kontrolleri

   7-Basit Nesneler

   8-Yürütme, döndürme, ölçekleme

   9-Doku Yükleme

  10-Ses Dosyaları

  11-Kamera Yönetimi

  12-Basit Slayt

  13-Mouse ile basit nesne karakter yönetimi

  14-Yön tuşları ve mouse ile basit nesne karakter yönetimi

  15-Animasyon vidyoları oluşturma

  16-Alt pencere yapımı

  17-Menü ve alt menüler

  18-**OpenGL**

  19-**OpenGL**

  20-**OpenGL**

  21-**OpenGL**

  22-**OpenGL**

  23-**OpenGL**

  24-**OpenGL**

  25-**OpenGL**

1-Derleyici Kurulumu


 OpenGL   kütüphanesini kullanmak  vede SFML kütüphanesinin ses dosyalarını kullanabilmek için
aşağıdaki adımları sabırla  gerçekleştiriyoruz.
 

1-Derleyiciyi çalıştırdıktan sonra en üst paneldeki settings sekmesini tıklayıp açılan menüden

                                                          Resme tıklayayıp büyültelim

compiler seçeneğine tıkladığımızda açılan tablodan

2-İlk 5 dosyayı derleyicinin içindeki MinGW / lib klasöründen

Resme tıklayayıp büyültelim.


Add butonuna tıklayarak 

Resme tıklayayıp büyültelim.


ilk 5 dosyayı link edelim

3- Tekrar Add butonuna tıklayarak klavyeden
sfml-audio yazarak
ok  layıp link edelim
(sfml kütüphanesini buradan indirip derleyicinin klasörüne kopyalayabilirsiniz)

(indirdikten sonra codeBlocks klasörüne kopyalayalım)

----------------



4- Yine derleyicinin içindeki sfml / lib klasöründen libsfml-system.a dosyasını link edelim

5-Derleyecinin defines sekmesine tıklayarak

Resme tıklayayıp büyültelim

klavyeden SFML_STATIC  yazalım.

5-Son olarak search directories sekmesinden derleyicinin kayıtlı olduğu

Resme tıklayayıp büyültelim

Resme tıklayayıp büyültelim


C:\Program Files (x86)\CodeBlocks\sfml\include   klasörünün yolunu gösterelim.
Klasör kaydı   farklı ise  siz kendi yolunuzu gösterin.

6- Derleyicimiz çalışmaya hazır. Kodlarımızı yazıp 

Resme tıklayayıp büyültelim

yeşil  sekmeye  build and run tıklayıp çaliştıralım.


UYARI

Blogdan indirilen klasörler içindeki kodların yazılı olduğu dosya üzerinden
 doğrudan
derleme yaparsanız hata verecektir. Kodu kopyalayıp yeni açtığınız projedeki 
main 
dosyasına kopyalayın.
 Yine indirilen klasör içindeki diğer dosyaları varsa klasörleri de
kendi proje klasörünüze atın. Bu şekilde çalışacaktır.
Codeblocks tan farklı bir derleyici kullanıyorsanız farklı dosyalar isteyebilir.






2-SFML

  SFML nedir diye merak ettiğimizde, hemen kendi sitesini açıp Türkçe'ye çevirdiğimizde nedir 

sorusunun cevabını alıyoruz.

  " Basit ve Hızlı Multimedya Kütüphanesi:

SFML, oyunların ve multimedya uygulamalarının geliştirilmesini kolaylaştırmak için bilgisayarınızın çeşitli bileşenlerine basit bir arayüz sağlar. Beş modülden oluşur: sistem, pencere, grafik, ses ve ağ.

SFML ile uygulamanız en yaygın işletim sistemlerinde derleyebilir ve kutudan çıkabilir: Windows, Linux, macOS ve yakında Android & iOS.

En sevdiğiniz işletim sistemi için önceden derlenmiş SDK'lar indirme sayfasında mevcuttur.

SFML, C ve .Net dilleri için resmi bağlamalara sahiptir. Aktif topluluğu sayesinde Java, Ruby, Python, Go ve daha fazlası gibi diğer birçok dilde de kullanılabilir."

-SFML kütüphanesini kendi sitesinden indirip derleyici kalasörünün  içine kopyalayalım.
  Her sürüm çalışmayabilir. Buradan çalışan sürümü indirebilirsiniz.Klasör içinde dll uzantılı dosyalar   olduğu için riskli dosya olarak gözükebilir.

sfml indir: sfml   (kullandığım sürüm)


Bizim burada sfml kütüphanesini kullanmamızın nedeni ogg uzantılı ses dosyalarını kullanabilmesidir. Buda
bize wav  uzantılı dosyalara kıyasla 10 kat alan kazandırması demektir. Dosya indirirken bunun değeri anlaşılacaktır. 

Sfml nin codeblocks derleyici ayarları kendi sitesinde gösterilmiştir. Bende burada anlatmaya çalıştım.

3-opengl

 

OpenGL, Glut, Freeglut  : 

OpenGL bir grafik kütüphanesidir. Açık kaynak bir platformdur. Ekrana üç boyutlu grafikler hazırlamak için kullanılan sistemdir. 

 

Glut , OpenGL uygulamaları oluştururken pencereleme sisteminin incelikleriyle başa çıkmak için basit ama yeterince güçlü bir araç takımı sağlamak amacıyla Mark Kilgard tarafından 1990' lı yılların başında tasarlandı.

O zamana göre GLUT çok etkili bir çözümdü ve tasarıya tamamen uyuyor. Günümüzde  daha güncel uygulamalar olmasına rağmen GLUT hala etraftaki en basit araç takımı ve yine de basit prototipler için gerekenlerin çoğunu yapıyor.

GLUT açık kaynak değildir, bu nedenle değiştirilemez, bu yüzden GLUT klonları ortaya çıkmıştır. En yaygın Glut değişimlerinden ikisi  OpenGLUT  ve  freeGLUT'tur. Bunlar iki açık kaynak projesidir. 


4-Temel Pencereler

                   PENCERELER:


   a- 2D 2 boyutlu pencereler
   b- 3D 
3 boyutlu pencereler

              2D PENCERELER
 Boş bir ekran oluşturmak.
 Bir pencere oluşturmak bu kadar basit ve kolay olabilir.
 
 örnek kod:
//-----------------------------------------------------------------

// freeglut ile boş bir ekran oluşturma
 
// bir pencere oluşturmak bu kadar basit ve kolay olabilir.

#include <GL/freeglut.h>


 void display()// ana ekranı görüntüleme
{
  // boş pencere olduğu için içi boş
}

int main(int argc, char **argv)
{
 glutInit(&argc, argv);// bütün işlevler
 glutInitWindowSize(400,300);// ekran boyutları
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE );// ekranın kullandığı özellikler

    glutCreateWindow("ilk pencere");// pencereyi oluştur. (tırnak içini boş bırakabiliriz.)

    glutDisplayFunc(display);//ana ekran geri arama çağrısı

    glutMainLoop();//tüm olay ana döngü

    return 0;
}

//----------------------------------------------------------------

sonuç: 
resmi tıklayarak büyültebilirsiniz.

 
=========================================================================

2. örnek:
 Turkuaz renkli bir arka plan oluşturma

örnek kod:
//-----------------------------------------------------------------

// turkuaz bir arka plan oluşturma

#include <GL/freeglut.h>


 void display() //ana ekranı, sahneyi, dünyayı görüntüle
{  // Sahnemizi dünyamızı doldurmaya başlıyoruz.
    glClearColor(0,1,1,1);// arka plan rengi
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSwapBuffers();//sahneyi çift tampon ile oluşturma
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);// bütün islevleri baslat
    glutInitWindowSize(400,300);// ekran boyutları
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

    glutCreateWindow("arka fon"); // pencereyi oluştur.
    glutDisplayFunc(display);//ana ekran

    glutMainLoop();
    return 0;
}





=========================================================================


2 mause yönetimi
  

5-Mouse Kontrolleri

                      MAUS  YÖNETİMİ

 Yaptığımız uygulamalarımızı kontrol etmenin iki yolu vardır,
1- Maus yardımı ile
2- Klavye yardımı ile

 Uygulamaları oluştururken kullanmış olduğumuz yardımcı kütüphanelerin farklı
olmasına rağmen maus yönetimleri temelde birbirine benzemektedir.

Biz burada glut yada freeglut kullanarak maus kontrelleri hakkında oldukça faydalı
bir bilgi edinmiş olacağız.

Ben burada internetten bulmuş olduğum bir dersi sizlerle paylaşarak anlatmaya çalışacağım.

Kodu aynen veriyorum.  Kod yanlarında açıklamalar yapmaya çalıştım.

/// Arkadaşlar bu alıntı ders bize maus yönetimi
/// hakkında çok güzel bir anlatım sunuyor.
/// Bilgiyi paylaşmanın güzelliğini ve kıymetini
/// insan daha iyi anlıyor.
/// By Grant James'e  teşekkür ediyor ve mutlu bir yaşam diliyoruz.

/********************************************
* Zeus CMD - GLUT Tutorial 03 : Mouse Input *
* By Grant James (ZEUS)                     *
* http://www.zeuscmd.com                    *
********************************************/
/// kod başlangıç
#include <iostream>
#include <gl/glut.h>

using namespace std;

bool lbuttonDown = false;
bool rbuttonDown = false;

bool init()
{
return true;
}

void display()
{
 /// bos bir dünya sahnesi
}


/// 1. maus yönetimi
void mouse(int button, int state, int x, int y)// butonlar, durum ve xy konum 
{
if (button == GLUT_RIGHT_BUTTON)// sag buton
{
if (state == GLUT_DOWN)// buton basılı
cout << " Sag dugme basildi"<< endl;
else// buton yukarda
cout << "Sag dugme birakildi "
<< " (" << x << "," << y<< ")" << endl;

}
else if (button == GLUT_LEFT_BUTTON)// sol buton
{
if (state == GLUT_DOWN)// buton basılı
lbuttonDown = true;// basılı iken motion fonksiyununu aktif yap. Bir..

else
lbuttonDown = false;//... aç kapa anahtar
}

if (state == GLUT_UP) lbuttonDown = false; cout << "sol tus pasif "<< endl;

}

/// 2. maus yönetimi
void motion(int x, int y)// haraket yakalama. Bir üstteki  
                      // void mouse(int button, int state, int x, int y) fonksiyonunun
                      //hareketlerini yakalayarak kullanıcıya geri döndürür.
                      // Hangi buton sağ sol gibi ve bunlar basılımı değilmi gibi
                      //vede xy konumlarını döndürmek gibi
{
if (lbuttonDown)// anahtar aktif
cout << "sol tus surukleniyor "
<< "(" << x << "," << y << ")" << endl;

}

/// 3. maus yönetimi
void motionPassive(int x, int y)// maus pasif durumda
{
cout << "fare geziyor "
<< "(" << x << "," << y << ")" << endl;
}

/// 4. maus yönetimi
void entry(int state)// maus oku ekranımızın sınırları içindemi yoksa değilmi dönüşünü verir
{
if (state == GLUT_ENTERED)
cout << "Fare giris yapti" << endl;//oluşan ekranımıza tıkladığımızda bu yazıyı görürüz
else
cout << "Fare ayrildi" << endl;// ekran dışında bir yere tıkladığımızda ise bu yazıyı görürüz
}

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

glutInitWindowPosition(200, 200);
glutInitWindowSize(200, 200);

glutCreateWindow("03 - Mouse Input");

glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutPassiveMotionFunc(motionPassive);
glutEntryFunc(entry);

if (!init())return 1;

glutMainLoop();

return 0;
}///  kod sonu



*********************************************************************************
Maus ve Buton ikilisi: By Grant James' den aldığımız bilgilerle birkaç buton denemesi yapalım. 

                                           
3-Örnek Buton 1


///----Buton 1 kodu --------------------
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
using namespace std;

void init();
void display();
int alan=6;/// 100*6   600x lik pencere
int winx=300; /// 600x lik pencerenin ortası

float korx, wx;

void buton(){

  glPushMatrix();
    glColor3f(1.0, 0.0, 0.0);

    glTranslatef(korx,0,0);
    glScalef(1,15,1);/// burada y değerinin 15 olması pencere yüksekliğinin küçük olmasıdır,

                              /// bu şekilde küpümüz normal gözükecektir.
    glutSolidCube(0.1); /// her türlü nesne olabilir biz burada küp seçtik.

    glPopMatrix();
}


void init(){
    glClearColor(1.0,1.0,1.0,1.0);
    gluOrtho2D(0.0, 600.0, 0.0, 600.0); 
}

void display(){
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();


    buton();

    glutSwapBuffers();
}

void motion(int nx, int ny)
{
       wx =(winx- nx)*(-0.02);
       korx=wx/alan; /// pencere koordinatlarını kartezyen koor. çevirme

      cout<<"Penx:"<<nx<<"  korx:"<< setprecision(2)<<korx<<endl;

        if(korx<=-0.94)korx=-0.94;
         if(korx>=0.94)korx=0.94;
          glutPostRedisplay();
}
void klavye (unsigned char k, int x, int y)
{
    if(k==27) exit(0);
}

int main(int argc, char* argv[]){
    glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(600,50);
    glutInitWindowPosition(300,300);
    glutCreateWindow("OpenGL Program");

    init();
    glutDisplayFunc(display);

glutMotionFunc(motion);
    glutKeyboardFunc( klavye);
    glutMainLoop();

    return 0;

}

///------------------Buton 1 kod sonu-------------------------------------------------


*********************************************************************************


4- Örnek Buton 2:


///------------------------------------
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip> ///
using namespace std;

void init();
void display();
int alan=6;/// 100*6   600x lik pencere
int winx=300; /// 600x lik pencerenin ortası
float bred=0.4;
float korx, wx;

void buton(){

  glPushMatrix();
    glColor3f(bred, 0.0, 0.0);

    glTranslatef(korx,0,0);
    glScalef(1,15,1);
    glutSolidCube(0.1); /// her türlü nesne olabilir  (glpoint)

    glPopMatrix();
}
void lines(){
   glColor3f(bred, 0.0, 0.0);
       glLineWidth(10.0);
        glPopMatrix();
        glBegin(GL_LINES);
glVertex2f(-1,0);
glVertex2f(korx,0); glColor3f(0.3,0.3,0.3);
glEnd();
glPopMatrix();
 glutPostRedisplay();
}

void init(){
    glClearColor(1.0,1.0,1.0,1.0);
    gluOrtho2D(0.0, 600.0, 0.0, 600.0);
}

void display(){
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

  lines();
    buton();

    glutSwapBuffers();
}


void mausKullan(int button, int state, int x, int y)
{

if (button == GLUT_LEFT_BUTTON) {


if (state == GLUT_DOWN) { // left mouse button pressed
bred=1;

}else bred=0.5;

}}





void motion(int nx, int ny)
{
       wx =(winx- nx)*(-0.02);
       korx=wx/alan; /// pencere koordinatlarını kartezyen koor. çevirme

      cout<<"Penx:"<<nx<<"  korx:"<< setprecision(2)<<korx<<endl; ///

        if(korx<=-0.94)korx=-0.94;
         if(korx>=0.94)korx=0.94;
          glutPostRedisplay();
}
void ess (unsigned char k, int x, int y)
{
    if(k==27) exit(0);
}

int main(int argc, char* argv[]){
    glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(600,50);/// y attırılabilir
    glutInitWindowPosition(300,300);
    glutCreateWindow("OpenGL Program");

    init();
    glutDisplayFunc(display);
glutMouseFunc(mausKullan);
glutMotionFunc(motion);
    glutKeyboardFunc(ess);
    glutMainLoop();

    return 0;

}

///------------------Buton 2 kod sonu-------------------------------------------------

********************************************************************************


5- Örnek Buton 3:

///------------------------------------------

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>

#include <iomanip> /// setpraction (x)
using namespace std;
static char bas[20];

void init();
void display();
int alam=4;/// x lik pencere  oranı
int winx=4;/// konum maus hizalama
int winx2=4;
float bred=0.3;
float korx, wxm;
short mk,mk2;
float bred2=0.3;
float korx2, wxm2;

void  rakam();

  void harfYazak(char *z)
  {
   unsigned int i;
    for (i = 0; i < strlen (z); i++)
     glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, z[i]);
     }

     void rakam(){
  glColor3f(bred,0,0);
       sprintf (bas," %1.0f ",korx*100);
        glRasterPos3f (0.20, 0.42,0);
          harfYazak (bas);
    glColor3f(bred2,0,0);
       sprintf (bas," %1.0f ",korx2*100);
        glRasterPos3f (0.20, -0.55,0);
          harfYazak (bas);



    }



void buton(){

  glPushMatrix();
    glColor3f(bred, 0.0, 0.0);

      glTranslatef(-0.98,0.5,0);
      glPointSize(10.0);
    glBegin(GL_POINTS);
    glVertex2f(korx,0.0);
    glEnd();
      glPopMatrix();
}
void lines(){
   glColor3f(bred, 0.0, 0.0);
    glPushMatrix();
     glTranslatef(-0.98,0.0,0);
       glLineWidth(3.0);

        glBegin(GL_LINES);
glVertex2f(0,0.5);
glVertex2f(korx,0.5); glColor3f(0.3,0.3,0.3);
glEnd();
glPopMatrix();
 glutPostRedisplay();
}
  ///-----------------------------
   void buton2(){

  glPushMatrix();
    glColor3f(bred2, 0.0, 0.0);

    glTranslatef(-0.98,-0.5,0);
    glPointSize(10.0);
glBegin(GL_POINTS);
glVertex2f(korx2,0.0);
glEnd();
    glPopMatrix();
}
   void lines2(){
   glColor3f(bred2, 0.0, 0.0);
    glPushMatrix();
     glTranslatef(-0.98,0.0,0);
       glLineWidth(3.0);

        glBegin(GL_LINES);
glVertex2f(0,-0.5);
glVertex2f(korx2,-0.5); glColor3f(0.3,0.3,0.3);
glEnd();
glPopMatrix();

 glutPostRedisplay();
}

 void fon(){

 glPushMatrix();

         glTranslatef(0,0.0,0);
       glColor3f(0.5,0.5,0.5);
                    glBegin(GL_QUADS); /// arka fon

       glVertex2f(-1.0,-1.0);
   glVertex2f( 1.0,-1.0);
   glVertex2f( 1.0, 1.0);
   glVertex2f(-1.0, 1.0);
 glEnd();


 glColor3f(0.8,0.8,0.8);
                    glBegin(GL_QUADS); /// buton 1

       glVertex2f(-0.98, 0.95);
   glVertex2f( 0.98, 0.95);
   glVertex2f( 0.98, 0.05);
   glVertex2f(-0.98, 0.05);
 glEnd();



                    glBegin(GL_QUADS); /// buton 2

       glVertex2f(-0.98,- 0.95);
   glVertex2f( 0.98, -0.95);
   glVertex2f( 0.98, -0.05);
   glVertex2f(-0.98, -0.05);
 glEnd();
glPopMatrix();

  glPushMatrix();  /// orta line
       glLineWidth(1.0);
       glColor3f(0.65,0.65,0.65);
        glBegin(GL_LINES);
      glVertex2f(-0.98,0.0);
       glVertex2f( 0.98,0.0);
        glEnd();
            glPopMatrix();



 }
  ///------------------------------
void init(){
    glClearColor(1.0,1.0,1.0,1.0);
    gluOrtho2D(0.0, 600.0, 0.0, 600.0);
}

void display(){
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    fon();
    lines();
     buton();

     lines2();
      buton2();
       rakam();

    glutSwapBuffers();
}


void mausKullan(int button, int state, int x, int y)
{

if (button == GLUT_LEFT_BUTTON) {


if (state == GLUT_DOWN) { // left mouse button pressed


      if(y<=74&&x<=200) {bred=1;}
  if(y>=76&&x<=200) {bred2=1; }


}  else {bred=0.3;bred2=0.3; }
      glutPostRedisplay();
}}


     void pasive_mouseTut(int x,int y){

    if(y<=74&&x<=210) bred=0.65;  else bred=0.3;
 if(y>=76&&x<=210){ bred2=0.65;} else bred2=0.3;

     /// glutPostRedisplay();

   }


void mouseHIZ(int nx, int ny)
{
  if(ny<=74)mk=1;
               if(mk==1) {
                  if(mk==1)mk=0;else mk=1;
                   wxm =(winx- nx)*(-0.02);
                    korx=wxm/alam;

                       if(korx<=0.0)korx=0.0;
                         if(korx>=1.0)korx=1.0;}

        if(ny>=76)mk2=1;
           if(mk2==1){
              if(mk2==1)mk2=0;else mk2=1;
                wxm2 =(winx2- nx)*(-0.02);
                 korx2=wxm2/alam;

                   if(korx2<=0.0)korx2=0.0;
                    if(korx2>=1.0)korx2=1.0;  }

              ///cout<<"Penx:"<<nx<<"   korx:"<<korx<<"   k2:"<<korx2<<endl;

          glutPostRedisplay();
}


void ess (unsigned char k, int x, int y)
{
    if(k==27) exit(0);
}

int main(int argc, char* argv[]){
    glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(400,150);/// y attırılabilir
    glutInitWindowPosition(300,300);
    glutCreateWindow("OpenGL Program");

    init();
    glutDisplayFunc(display);
  glutMouseFunc(mausKullan);
  glutPassiveMotionFunc(pasive_mouseTut);
  glutMotionFunc(mouseHIZ);
    glutKeyboardFunc(ess);
    glutMainLoop();

    return 0;

}

///------------------------------------------------------------------------------------------------

7-Basit Nesneler

 -Basit Nesneler

 OpenGL kütüphanesi basit şekiller oluşturmamıza imkan sağlar.  Bunlar nokta, çizgi, üçgen, dörtgen ve çokgen gibi basit nesnelerdir.

 Birde OpenGL'e artı GLU kütüphanesi vardır. Burada ise kullanıcının hazır  nesneleri kullanma imkanı mevcuttur. Silindir, küre, küp vb.

 Yine glut kütüphanesinde de hazır nesneler mevcuttur.

 Fakat bunlarla da yapabileceklerimiz sınırlıdır.  Karmaşık yapılardan oluşan nesneleri ise, 3d programlarda  hazırlayıp projelerimize dahil edebiliriz.

                                                resimleri tıklayarak büyültebiliriz


                                                     OpenGL basit nesneler

  Aşağıdaki GL_TRIANGLE_STRIP yukarıdaki resimde verilen örnek  çizimin  kodudur.

    glBegin(GL_TRIANGLE_STRIP);

glVertex3f( 0.0, 0.0, 0.0);//0

glVertex3f( 0.1, 0.2, 0.0);//1

glVertex3f( 0.3, 0.0, 0.0);//2

glVertex3f( 0.5, 0.2, 0.0);//3

glVertex3f( 0.6, 0.0, 0.0);//4

   glEnd();  

 "Burada 2f  ile de çizebilirdik.  3f de Z koordinatı boş geçilmiştir."

                                                   resimleri tıklayarak büyültebiliriz 

                                                               
 Glut ile gelen bazı  hazır nesneler

       glutSolidSphere(3,12,12);  Burada ise glut bize katı olarak 3 birim 

çapında olan 12 yatay ve 12 dikey hattan oluşan hazır bir küre sunmaktadır.

Burada opengl buymuş diye bir düşünce  aklımızda  oluşmasın.

 OpenGL bir derya bunlar ise deryadan bir damla.  



6-Klavye Kontrolleri

 -Klavye Kontrolleri

 Bilgisayarda birşeyler yapmanın ikinci yolu klavye kullanmaktır.  Bunu klavye üzerindeki

 tuşlar ile yaparız.

 Klavyedeki her tuşun bir sayısal karşılığı vardır.

 Bu tüm dünyada bir norm halini almış ve ASCII tablosu olarak adlandırılmştır.

 Bizde bu sayısal karşılıkları kodlayarak klavye işlemlerimizi gerçekleştireceğiz.


 Bizim kullandığımız freeglut yada glut pencere sisteminde klavye erişim fonksiyonları şunlardır.


 void processNormalKeys(unsigned char key, int x, int y){ kodlar }


 void pressSpecialKey(int key, int x, int y) { kodlar }

 void releaseSpecialKey(int key, int x, int y){ kodlar }


 Tuşları kullanırken dikkat etmemiz gereken mausumuzun kullandığımız pencere içinde olmasıdır.

 Maus hangi pencere içindeyse o pencereye ait klavye aktif edilecektir.

 Yaptığımız projede birden fazla pencere veya ana pencereye ait alt pencereler olabilir.

8-Yürütme, döndürme, ölçekleme

 -Yürütme, döndürme, ölçekleme

9-Doku Yükleme

 -Doku Yükleme

10-Ses Dosyaları

 -Ses Dosyaları

11-Kamera Yönetimi

1-Kamera Yönetimi

12-Basit Slayt

Basit slayt:
Gereken dll: glut32.dll, glaux.dll
Dokuları ve kodu indir

 
 


                                                     

-Beş adet doku dosyamızı artırarak ekrana aktarıyoruz. Basit bir ateş animasyonu elde ediyoruz.

///=================================================================
/// alev animasyonu

#include <gl\glaux.h>
#include <gl\glut.h>

unsigned  doku[5];
float b;
int say;
int a;

  void dokuyukle()// 5 adet dokuyu yükleme
{
AUX_RGBImageRec *dokular[5];
memset(dokular,0,sizeof(void *)*5);
    if ((dokular[0] = auxDIBImageLoad("F0.bmp"))&&
 (dokular[1] = auxDIBImageLoad("F1.bmp"))&&
          (dokular[2] = auxDIBImageLoad("F2.bmp"))&&
           (dokular[3] = auxDIBImageLoad("F3.bmp"))&&
            (dokular[4] = auxDIBImageLoad("F4.bmp"))

       )

{
glGenTextures(5, &doku[0]);
 for(say=0;say<5;say++)
 {
glBindTexture(GL_TEXTURE_2D, doku[say]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, dokular[say]->sizeX, dokular[0]->sizeY,
             0, GL_RGB, GL_UNSIGNED_BYTE, dokular[say]->data);
  }}

}

void kamera(int en,  int boy)
 {
    dokuyukle();
glEnable(GL_TEXTURE_2D);
glClearColor(0.0, 0.0, 0.0, 0.5);
        glViewport(0, 0, 250, 250);
        glMatrixMode(GL_PROJECTION);
        gluOrtho2D(-250, 250, -250, 250);// 2d boyutlu pencere

}

void sahne()
 {

   glClearColor(0, 0.6,1 ,1.0);/// arka plan renk ayarlaması
glClear(GL_COLOR_BUFFER_BIT );

       say=a;

           b+=0.1; /// b degiskeninin değerini degistirerek  anim. hızını degistirebiliriz

             if(b>100){b=0;a+=1;} /// doku slaytini baslat

             glBindTexture(GL_TEXTURE_2D, doku[a]);
glBegin(GL_QUADS);
             glTexCoord2f(0.0, 0.0);   glVertex3f(-200.0,-200.0, 0.0);
glTexCoord2f(1.0, 0.0);   glVertex3f( 200.0,-200.0, 0.0);
   glTexCoord2f(1.0, 1.0);   glVertex3f( 200.0, 200.0, 0.0);
   glTexCoord2f(0.0, 1.0);   glVertex3f(-200.0, 200.0, 0.0);
                 glEnd();

            if(a>4)a=0; /// slayti döngüye al

        glutSwapBuffers();glutPostRedisplay();

}

int main(int argc, char** argv)
{
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(100,100);
    glutInit(&argc, argv);
    glutCreateWindow("resim ");
    glutReshapeFunc(kamera);
    glutDisplayFunc(sahne);
    glutMainLoop();
    return 0;
}

///=====================================================================

13- Mouse ile basit nesne karakter yönetimi

 Karakter nesne:



 3D alan üzerinde mausu tıkladığımız yerde tel küp kafes oluşmakta ve kırmızı küre (karakterimiz) işaretlenen
noktaya gitmektedir. Hedefe varmadan yeni bir hedef belirleyebilir yada sol mausu sürükleyerek peşinizden
koşturabilirsiniz.





 

  N_Karakter uygulamayı: indir

uygulama kodumuz aşağıda verilmiştir.






/// 3D ALANDA HEDEF BULMA
// Daha önce 2d alan üzerindeki yapmıs olduğum yön bulma algoritmasını
// bu 3d alana uyarladık. Daha da sadelestirilebilir.
// Farklı çözümlemeler muhakkak vardır.
// kullanmadığımız değişkenler kalmış olabilir

// 3d bir pencerede uzayda kaybolmama ve doğru konumlanma icin Nesneler her
// zaman bu 2 matrix arasına alınır.
//glPushMatrix(); nesne glPopMatrix();  nesnelerin zemine (istediğimiz yere) doğru 
//konumlanmasını sağlayan matrixlerdir
// Nesnelerin istediğimiz yere doğru konumlanması icin nesne bu ikisi arasında olmalıdır.


#include <iomanip>
#include<stdlib.h>
#include<stdio.h>
#include <gl/glaux.h>
#include <time.h>
#include <math.h>
#include <iostream>
#include <gl/freeglut.h>
#include <gl/gl.h>
#include <iostream>
#define ESC 27

bool karakterAl= false;
float GAZ= 0.0;

float lazer=0.0;
short dur,yon;
float iox,ioz,arax,araz;
int ay=0,ay1=0;

GLdouble ox=0.0,oy=0.0,oz=0.0;

float tcap,icap,xcap,fcap;

float scb,ascb=1;;/// solid cube ve anahtar

float d=0;

int anapen;
int altpen;
float der=0;
float rad=0,rado1;

float uz1,uz2;
static char bas[10];

float tx;
float my=30;
float tz;
float mx;
float mz=0;

float ty=0.1;

float x = 0.0, y = 9.0,z=-10; //
float deltaMove = 0.0; //


// Camera direction kamera yönü
float lx = 0.0, ly=-15,lz=0.1; // camera points initially along y-axis
float angle = 0.0; // angle of rotation for the camera direction
float deltaAngle = 0.0; // additional angle change when dragging

// Mouse drag control
int isDragging = 0; // true when dragging sürüklemek
int xDragStart = 0; // records the x-coordinate when dragging starts


///-----------------------------------------------------------------------

using namespace std;

///-------------------------------------------------------------------------------

void harfYaz(char *s)
{
unsigned int i;
  for (i = 0; i < strlen (s); i++)
    glutBitmapCharacter (GLUT_BITMAP_HELVETICA_18, s[i]);
}

void harfYazak(char *s)
{
unsigned int i;
  for (i = 0; i < strlen (s); i++)
    glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12, s[i]);
}

void kamera(int w, int h)
{
float ratio =  ((float) w) / ((float) h); // window aspect ratio
glMatrixMode(GL_PROJECTION); // projection matrix is active
glLoadIdentity(); // reset the projection
gluPerspective(60.0, ratio, 0.1, 150.0); // perspective transformation
glMatrixMode(GL_MODELVIEW); // return to modelview mode
glViewport(0, 0, w, h); // set viewport (drawing area) to entire window

}

void zeminTop()// zeminde belirli aralıklarla çoğaltacağımız topların prototipi
{
glColor3f(1.0, 1.0, 1.0);/// bazen farkında olmadan renkler karışabilir. Bu şekilde
                         /// beyaz bir filtre yaparak istediğimiz rengi elde ederiz.


  //glPushMatrix(); bir sonraki foksiyonda çoğaltma esnasında matrixleri kullandığımz için burada
  // kullanmasakda olur.

glColor3f(1.0, 1.0, 0.0);
glutSolidSphere(0.16, 6, 6);

//glPopMatrix();
}


void alan()
{ int i, j;

// zeminimiz
glColor3f(0.0, 0.7, 0.0);
glTranslatef(0,0,0);
glBegin(GL_QUADS);
glVertex4f(-60.0,0, -60.0, 1);
glVertex4f(-60.0,0,  60.0, 1);
glVertex4f(60.0,0, 60.0, 1);
glVertex4f( 60.0,0, -60.0, 1);
glEnd();


// 11*11 121 adet zemine 2 birim arayla top yerlestiriyoruz.
for(i = -5; i < 6; i++)
for(j = -5; j < 6; j++) {
glPushMatrix();// nesnelerin zemine (istediğimiz yere) doğru konumlanmasını sağlayan matrix
glTranslatef(i*2.0,0 , j*2.0);
zeminTop();
glPopMatrix();// nesnelerin istediğimiz yere doğru konumlanmasını sağlayan 2. matrix
              // 3d uzayda kaybolmama ve doğru konumlama icin Nesneler her zaman bu 2 matrix arasına alınır.
}
}

//**********************************************************************************


void update(void)// yon tusları ile kamera hareket hızı
{

if (deltaMove) { // update camera position
mx += deltaMove * lx * 0.1;
mz += deltaMove * lz * 0.1;
}
glutPostRedisplay(); // redisplay everything
}
void koordinat()

{

    glPushMatrix();
glTranslatef(0,0.1,0);
glColor3f(0.0,0.0,1.0);
glLineWidth(1);
glBegin(GL_LINES);
glVertex3f(0.0,0,-20.0);
glVertex3f(0.0,0,20.0);
glColor3f(1.0,0.0,0.0);
glVertex3f(-20.0,0,0.0);
glVertex3f(20.0,0,0.0);
glEnd();   glPopMatrix();
}

void koorcapsd()
{

    glPushMatrix();
glTranslatef(0,0.2,0);
glColor3f(0.0,0.0,1.0);
glLineWidth(3);
glBegin(GL_LINES);


glVertex3f(ox,0,oz);
glVertex3f(0,0,0);
    glEnd();  glPopMatrix();



}//********************************************************

void karakter1()//******************************
{

{
glColor4f(0.9,0.2,0.0,1.0);
            glTranslatef (tx,-0.23 ,tz );
            glPushMatrix();
            glScalef(3,1,1);
             glRotatef(d,0,1,0); //önünü hedef yönüne döndürmek
             glutSolidSphere(0.50, 20, 20);
           glPopMatrix(); }


if(yon==1||yon==3)d=-rad*180/3.14;/// kendi içinde zıt
if(yon==2||yon==4)d=-1*rad*180/3.14;///bunlarda kendi içinde zıt

}


void karakter2()
{
   glColor3f(1.0,0.0,0.0);
            glTranslatef (tx,0.02 ,tz );
            glPushMatrix();
            glRotatef(d,0,1,0);//önünü hedef yönüne döndürmek

 glBegin(GL_TRIANGLES);
glVertex3f(-0.5,0,0.5);///glColor3f(0.0,1.0,0.0);
glVertex3f(-0.5,0,-0.5); ///glColor3f(1.0,0.0,0.0);
glVertex3f(1.0,0,0.0);
glEnd();


if(yon==1||yon==3)d=-rad*180/3.14;/// kendi içinde zıt
if(yon==2||yon==4)d=-1*rad*180/3.14;///bunlarda kendi içinde zıt

  glPopMatrix();
}///-------------------------------------



void adem()//  konum isaretleme tel kafesimiz
 {
    glColor3f(0.0, 0.0, 1.0);// mavi renk

  if(ascb==1){

         if(tx==ox)scb=0;else scb=1.0;
    {glPushMatrix();

glTranslatef (iox,0 , ioz );

        glutWireCube(scb);
         glPopMatrix();}
    }
 }//------------------------------


void klavye (unsigned char key, int x, int y)// klavyeden veri alma
{
  if(key==49){mz=0;my=30;ly=-15;  }// kamera bakış açısı üst
      if(key=='z'||key=='Z'){GAZ=0;}// durdur
      if(key=='x'||key=='X'){GAZ=0.1;}// hızı değiştir
      if(key=='a'||key=='A'){if(karakterAl==1)karakterAl=0;else karakterAl=1;}// karakter değistir
 if(key==32){tx=0;tz=0;mx=0;mz=0; ox=0;oz=0;ay=0;ay1=0;icap=0;fcap=0;rad=0;}// konum sıfırlama

      if(key==27){exit(0);}// kapat çık
      if(key==48){my=10;mz=-25;tx=0; ly=-0.2;}// kamera bakış açısı perspektif

}///-------------------------------------



   void yonler()

    { //  Daha önce 2d alan üzerindeki yapmıs olduğum yön bulma algoritmasını
                    // bu 3d alana uyarladık. Daha da sadelestirilebilir.
                    // Farklı çözümlemeler muhakkak vardır.


    switch(yon){

     case 1:
             if(tx>=ox+iox&&tz>=oz+ioz){GAZ=0;ox=tx;oz=tz;}
                                 if(ay==1 )
                                { lazer=GAZ;if(ox!=0 )ay1=1;
                                       if(ay1==1){
                                            tx+=cos( rad )*GAZ;
                                            tz+=sin( rad )*GAZ;
                                            }

                                }else {GAZ=0;tx=tx;tz=tz;}
                                                                      break;
    case 2:
          if(tx>=ox+iox&&tz<=oz+ioz){GAZ=0;ox=tx;oz=tz;}
                                 if(ay==1 )
                                { lazer=GAZ;if(ox!=0 )ay1=1;
                                       if(ay1==1){
                                            tx+=cos( rad )*GAZ;
                                            tz+=sin( rad )*GAZ;
                                            }

                                }else {GAZ=0;tx=tx;tz=tz;}

                                                                       break;
     case 3:
                     if(tx<=ox+iox&&tz<=oz+ioz){GAZ=0;ox=tx;oz=tz;}
                                 if(ay==1 )
                                { lazer=GAZ;if(ox!=0 )ay1=1;
                                       if(ay1==1){
                                            tx+=cos( rad )*GAZ;
                                            tz+=sin( rad )*GAZ;
                                            }


                                } else {GAZ=0;tx=tx;tz=tz;}

                                                                      break;
     case 4:
                     if(tx<=ox+iox&&tz>=oz+ioz){GAZ=0;ox=tx;oz=tz;}
                                 if(ay==1 )
                                { lazer=GAZ;if(ox!=0 )ay1=1;
                                       if(ay1==1){

                                            tx+=cos( rad )*GAZ;
                                            tz+=sin( rad )*GAZ;
                                            }


                                } else {GAZ=0;tx=tx;tz=tz;}
                                                                      break;


 glutPostRedisplay();

 }}//----------------------------------------------------------------------------------------------------

void renderScene()// 3d sahne dünyamız
{

  xcap=(ox*ox)+(oz*oz);// karakterimizin değişen
       xcap=sqrt(xcap) ;// hedefleri doğru bulması icin (uzaklık, çap alma işlemi)


// Clear color and depth buffers
glClearColor(0.0, 0.7, 1.0, 1.0); // sky color is light blue
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glLoadIdentity();// uzay matrixini almak


gluLookAt(mx, my, mz,
      mx + lx,my + ly,mz + lz,
  0.0f,1.0f,0.0f);///  kamera yönetimi

      yonler();
      update();
      alan();
      koordinat();

glPushMatrix();
    glDepthMask(GL_FALSE);
    glTranslated(ox,oy,oz);// tel kafesin konumunu alma
    adem();/// telkafes (hedef isaretleme)
    glutSolidSphere(0.0,15,15);

    glDepthMask(GL_TRUE);
    glPopMatrix();

        if(karakterAl==true)karakter1();// top hedefe giden
        if(karakterAl==false)karakter2();// ücgen hedefe giden

      glutSwapBuffers();// görüntü alma
      glutPostRedisplay();// run time çalışma

}


void altkare(){//alt pencereyi çizgilerle ayırma

                             glColor3f(0.0,0.5,1.0);

                               glBegin(GL_LINES);

                         glVertex2f(0.0,-1.0);
                         glVertex2f(0.0,1.0);
                         glVertex2f(1.0,0.0);
                         glVertex2f(-1.0,0.0);
                         glVertex2f(-0.8,1.0);
                         glVertex2f(-0.8,-1.0);
                         glVertex2f(0.8,1.0);
                         glVertex2f(0.8,-1.0);

                           glEnd();;

}






void altRender()// alt pencerenin dünyası

{
   glClearColor(0.9, 0.8, 0.2, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

       glTexCoord4f(1, 0,0,1);
        glColor3f(0.7, 0.7, 0.7);
       glRectd(-0.25,-1.0,0.45,1);
       altkare();// alt pencereyi bölümlere ayırma


   glColor3f(0.0, 0.0, 0.0);
       sprintf (bas,"a: karakter al " );
       glRasterPos2f (-0.25, -0.8);
       harfYazak (bas);

       sprintf (bas,"yon tuslari-sag maus");
       glRasterPos2f (-0.25, 0.1);
       harfYazak (bas);

      sprintf (bas,"ox oz : %1.1f : %1.1f ",ox,oz );
      glRasterPos2f (0.05, 0.1);
      harfYaz (bas);


      sprintf (bas," tx  tz : %1.1f : %1.1f ",tx,tz );
      glRasterPos2f (0.05, -0.9);
      harfYaz (bas);

     if(yon==1)  {glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"1 Dogu");
      glRasterPos2f (-0.99, 0.1);
      harfYaz (bas);}

        if(yon==2)  {glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"2 kuzey");
      glRasterPos2f (-0.99, -0.8);
      harfYaz (bas);}

       if(yon==4)  {glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"4 Guney");
      glRasterPos2f (0.80, 0.1);
      harfYaz (bas);}

      if(yon==3)  {glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"3 Bati");
      glRasterPos2f (0.66, -0.9);
      harfYaz (bas);}

      {glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"x: Gaz=0.1");
      glRasterPos2f (0.46, -0.8);
      harfYazak (bas);}

           glColor3f(0.0, 0.0, 0.0);
     sprintf (bas,"  gaz %1.2f  ",GAZ );
      glRasterPos2f (0.8, -0.8);
      harfYaz (bas);
/// ************************

        glColor3f(0.0, 0.0, 0.0);
      sprintf (bas,"z: Gaz=0.0");
      glRasterPos2f (0.45, 0.18);
      harfYazak (bas);


      glColor3f(0.0, 0.0, 0.0);

      sprintf (bas,"drc:%1.0f ",d);
      glRasterPos2f (-0.5, -0.8);
      harfYaz (bas);

      sprintf (bas," rad:%1.1f ",rad);///= 0,0174
      glRasterPos2f (-0.5, 0.1);
      harfYaz (bas);
     sprintf (bas,"0 ve 1 kamera acisi ");
     glRasterPos2f (-0.79, 0.1);
      harfYazak (bas);

       sprintf (bas," xcap: %1.0f ",xcap);
       glRasterPos2f (-0.78, -0.8);
       harfYaz (bas);


/// **************************
     glutSwapBuffers();/// sürekli görüntü alma
     glutPostRedisplay();///sürekli döngü run time anlık veri alma
}


void pressSpecialKey(int key, int xx, int yy)
{
switch (key) {
case GLUT_KEY_UP : deltaMove = 0.30; break;// kamera tuş yönetimi
case GLUT_KEY_DOWN : deltaMove = -0.30; break;// kamera tuş yönetimi
}
}

void releaseSpecialKey(int key, int x, int y)
{
switch (key) {
case GLUT_KEY_UP : deltaMove = 0.0; break;// tus yukarda kamerayı durdur
case GLUT_KEY_DOWN : deltaMove = 0.0; break;// tus yukarda kamerayı durdur
}
}


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



void mouseMove(int x, int y) // sürekli maus konumunu  almak (basarak yada basmadan sürüklerken)
                             // sürükleme esnasındaki sürekliliği bu anlık
                              //konum yakalama fonksiyunuyla yapıyoruz. glutMotionFunc(mouseMove);
{   ascb=0;
if (isDragging) { // only when dragging
// update the change in angle
deltaAngle = (x - xDragStart) * 0.005;
// camera's direction is set to angle + deltaAngle
lx = -sin(angle + deltaAngle);
lz = cos(angle + deltaAngle);
}


///*************************************************************
 GLint viewport[4];// burdan
     GLdouble modelview[16],projection[16];
     GLfloat wx=x,wy,wz;

    glGetIntegerv(GL_VIEWPORT,viewport);
    y=viewport[3]-y;
    wy=y;
    glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
    glGetDoublev(GL_PROJECTION_MATRIX,projection);
    glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz);
    gluUnProject(wx,wy,wz,modelview,projection,viewport,&ox,&oy,&oz);// bu arada ki kod bloku 3d uzayda mausun tıkladığı xyz konumunu bize verir
                                                                     // bunu internette ki bir uygulamadan aldım. O uygulamayıda blogda vereceğim inşallah.
                                                                     // burada fonksiyon sonuna kadar olan bölümü bir alttaki
                                                                     //tıklanan maus fonksiyonunda da kullanacağız.
             if(xcap!=tcap) {arax=tx;araz=tz;iox=arax;ioz=araz;
                     rad=atan2(araz,arax); }// hedefe varmadan hedef değiştiğinde yeni hedef konumunu almak

                  uz1=ox;   uz2=oz;  ///x z kordinatlarinin atanmasi
   rad=atan2(uz2,uz1);///2 nokta arasindaki aciyi alma


           ///------------------------------------

           if(ox>0&&oz>0) {yon=1;ay=1;} ///  dogu

         if(ox>0&&oz<0) {yon=2;ay=1; } /// kuzey

  if(ox<0&&oz<0) {yon=3; ay=1;} /// bati

                        if(ox<0&&oz>0) {yon=4; ay=1;} /// guney


}//<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>


void murat(int button, int state, int x, int y) // ** tıklanan  maus **
                                                // sağ kulak ile kamera bakış açısı sol kulak konum alma)
{

if (button == GLUT_RIGHT_BUTTON) { // sağ maus basılı iken ekran yönetimi
     ascb=0;ay=0;
if (state == GLUT_DOWN) { // left mouse button pressed
isDragging = 1; // start dragging
xDragStart = x; // save x where button first pressed

}
else  { /* (state = GLUT_UP) */
angle += deltaAngle; // update camera turning angle
isDragging = 0; // no longer dragging
}
}

///  ----------------------------------------------------------
switch(button) {
case GLUT_LEFT_BUTTON :  // sol buton kullan

{
     ascb=1;
 if(state == GLUT_DOWN) {  iox=ox;ioz=oz;///sol buton basıldığında  koordinat ataması ***
                               GAZ=0.03;// ilk hız atama

 GLint viewport[4];// buradan (3d uzayda xyz konumunu verir)
     GLdouble modelview[16],projection[16];
     GLfloat wx=x,wy,wz;

    glGetIntegerv(GL_VIEWPORT,viewport);
    y=viewport[3]-y;
    wy=y;
    glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
    glGetDoublev(GL_PROJECTION_MATRIX,projection);
    glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz);
    gluUnProject(wx,wy,wz,modelview,projection,viewport,&ox,&oy,&oz);// buraya 3d 
//uzayda xyz konumunu verir

                    if(xcap!=tcap) {arax=tx;araz=tz;iox=arax;ioz=araz;

       rad=atan2(araz,arax);// hedefe varmadan hedef değiştiğinde 
//yeni hedef konumunu almak
          }
                  uz1=ox;   uz2=oz;  // x z kordinatlarinin atanmasi (y sürekli 0 karakterlerimiz için)
   rad=atan2(uz2,uz1);// 2 nokta (x,z) arasindaki aciyi alma


           ///---------yön bulma------------------

            if(ox>0&&oz>0) {yon=1;ay=1;} ///  dogu

         if(ox>0&&oz<0) {yon=2;ay=1; } /// kuzey

  if(ox<0&&oz<0) {yon=3; ay=1;} /// bati

                        if(ox<0&&oz>0) {yon=4; ay=1;} /// guney

                          break;
            }
        }
}
}//-------------------------------------------------------

//----------------------------------------------------------------------
// Main program  - standard GLUT initializations and callbacks
//----------------------------------------------------------------------
int main(int argc, char **argv)
{
// general initializations
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(5, 5);
glutInitWindowSize(800,600);
    anapen=glutCreateWindow("OpenGL/Mekke Program");

// register callbacks
glutReshapeFunc(kamera); // window reshape callback
glutDisplayFunc(renderScene); // (re)display callback

glutIgnoreKeyRepeat(1); // ignore key repeat when holding key down
glutMouseFunc(murat); // process mouse button push/release

glutMotionFunc(mouseMove); // process mouse dragging motion
glutKeyboardFunc(klavye);
glutSpecialFunc(pressSpecialKey); // process special key pressed

glutSpecialUpFunc(releaseSpecialKey); // process special key release
    glEnable(GL_DEPTH_TEST);// subwin den once olmalı

    altpen=glutCreateSubWindow(anapen,5,565,790,34);//pen,x-y,weight-high
glutDisplayFunc(altRender);


glutMainLoop();

return 0; // this is just to keep the compiler happy
}