Java Dilinde OpenGL ile Güneş, Dünya, Ay Sisteminin Yapımı

Yazar:



İlkokul yıllarından beridir öğretilen Güneş sistemini şimdi ise kodlara dökeceğiz ve bunun sonucunda kendi tasalardığımız güneş sistemimizi elde etmiş olacağız. Aşağıdaki gif resimden de görüleceği üzere aslında güneş sisteminde birçok gezegen vardır ama biz OpenGL ile sadece Güneş, Dünya ve Ay'ın birbirlerine göre olan hareketlerini kodlayacağız.

Üstteki gif resme göre bizim ilgilenmemiz gereken kısım ortadaki Güneş, 3. dairede dönen Dünya ve dünyanın etrafında dönmekte olan Ay olacak.

Güneş sistemine göre,
* Güneş sabittir ve kendi etrafında soldan sağa döner.
* Dünya hem kendi etrafında hem de Güneş etrafında soldan sağa döner.
* Ay hem kendi etrafında hem de Dünya'nın etrafında soldan sağa döner.

Öncelikle GL Translatef ile bir sahne yaratmamız gerekecek. Bu sahnede ise Güneş olacak. Sahnemizi GL Translatef ile belirleyeceğiz.

gl.glTranslatef(0f, 0f, -300f);  //sahne

Burada 1. parametre X, 2. parametre Y ve 3. parametre Z eksenidir.  X ve Y eksenlerini sabit bıraktım. Z eksenini ise -300f olarak belirledim. -300f yapmam ile birlikte Güneş'in bize Z ekseninde 300f uzakta olmasını sağladık. Kodları kendiniz yazdığınız sırada bu değerle oynarsanız ne demek istediğimi daha iyi anlayabilirsiniz.

Sahnemizi belirledikten sonra bu sahnemize Güneş'i çizip, kendi ekseni etrafında dönmesini sağlayacağız.Güneş'i kendi ekseni etrafında döndürebilmek için, Güneş'i çizmeden önce dönme fonksiyonunu yazmamız gerekiyor. 

gl.glRotatef(aci, 0f, 1f, 0f); //Y ekseninde dönüş.
gl.glColor3f(1f, 0.2f, 0.0f); //Güneşin rengi

3 sayısal parametre arasından ortadakinin değerini 1 yapmam ile beraber artık Güneş'i kendi ekseni etrafında soldan sağa döndürmüş olduk. Baştaki açı ise display fonksiyonu dışında float olarak tanımlanan bir ifadedir. Anlatımın sonunda indirme kodları var. Onları incelediğiniz zaman demek istediğimi anlayacaksınız zaten.

Dönüşünü ve rengini belirledikten sonra sıra geldi Güneş'in kendisini oluşturmaya. GLUquadric kullanacağız.

GLUquadric gunes = glu.gluNewQuadric();
glu.gluSphere(gunes,30f,15,15);
glu.gluDeleteQuadric(gunes);

30f ifadesine kabaca boyut diyebiliriz ama aslında tam olarak öyle değil. 30f ifadesi, Güneş'in Z ekseni üzerinde bize olan uzaklığını ifade ediyor. Bu değeri büyüttükçe Güneş'in +Z eksenindeki konumunu arttırmış oluyoruz. Bu da bize, sanki Güneş'in boyutunu büyütmüşüz gibi gelebilir. 15 olan ifadeler ise Quadric şeklinin küre haline gelmesi sağlıyor. (bkn:quadric)

Güneşin oluşturulması ile ilgili tüm kodlar işte bunlardı. Şimdi ise Güneş'in üzerine siyah bir kare koyalım ki maksat döndüğü belli olsun.

    //güneşin üzerindeki siyah kare :
    gl.glColor3f(0.0f, 0.0f, 0.0f);
    gl.glBegin(GL_QUADS);
    gl.glVertex3f(1f,1f,30.001f);
    gl.glVertex3f(-1f,1f,30.001f);
    gl.glVertex3f(-1f,-1f,30.001f);
    gl.glVertex3f(1f,-1f,30.001f);
    gl.glEnd(); //Güneş'e ait kodların bittiğini belirttik.


Siyah karemizi de bu şekilde oluşturduk. Karenin 4 köşesinin de koordinatlarına dikkat ederseniz eğer, Z koordinatını hepsinde 30.001f olarak yazdım. Çünkü Güneş +Z ekseninde 30f koordinatındaydı. Biz de eğer karenin +Z eksenini 30.001f olarak ayarlarsak, kareyi güneşe yapışık gibi görebiliriz. Bu değer artarsa güneşten ayrılır. Bu değer azalırsa, kare Güneş'in içine girer ve gözükmez.

Güneş'i de yaptıktan sonra şimdi gelelim Dünya'yı yapmaya. Dünya için de benzer işlemleri uygulayacağız. Dünya için önce bir sahne yaratıp daha sonra yine aynı şekilde Dünya'yı bu sahnede oluşturup, döndereceğiz. Ama Dünya, Güneş gibi sadece kendi ekseni etrafında dönmüyor. Aynı zamanda Güneş etrafında da dönüyor. İşte bu yüzden Dünya'nın sahnesini Güneş etrafında döndürmeliyiz. Dünya'yı da kendi ekseninde döndürmeliyiz ki, Dünya hem kendi etrafında hem de Güneş etrafında dönüyormuş gibi gözüksün.

O zaman dünyanın sahnesini yazmadan önce, eksenin Güneş etrafında dönmesini sağlayacak Rotatef kodunu yazalım. Daha sonra sahneyi oluşturalım :

gl.glRotatef(aci, 0f, 1f, 0f); //Y ekseninde döndürme kodunu yazdık.
gl.glTranslatef(0f, 0f, -80f); //Dünya'nın sahnesini oluşturduk.

Sahneye ait kodları yazdık. Şimdi Dünya'ya ait kodları yazalım. Yani kendi etrafında döndürelim, renk verelim ve son olarak Dünya'nın kendisini yapalım.

gl.glColor3f(0f, 0f, 1f); //Dünya'nın rengi
gl.glRotatef(aci1, 0f, 1f, 0f); //Dünya'nın kendi etrafında dönüşü.

Renk ve kendi ekseni etrafında dönüş şeklini belirledik. Sıra geldi Dünya'nın kendisini oluşturmaya :

GLUquadric dunya = glu.gluNewQuadric();
glu.gluSphere(dunya,12f,15,15);
glu.gluDeleteQuadric(dunya);

Dünya işlemleri de bu kadardı. Güneş için yaptığımız siyah karenin kodlarının aynısı yazacağız şimdi. Tek fark ise, karenin 4 köşesinin de +Z eksenleri bu sefer 12.001f olacak. Çünkü, üstteki koddan da göreceğiniz üzere, Dünya'nın +Z ekseni üzerindeki koordinatını +12f olarak belirlemiştik Dünya'yı oluştururken.

    //dünyanın üzerindeki siyah kare :
    gl.glColor3f(0.0f, 0.0f, 0.0f);
    gl.glBegin(GL_QUADS);
    gl.glVertex3f(1f,1f,12.001f);
    gl.glVertex3f(-1f,1f,12.001f);
    gl.glVertex3f(-1f,-1f,12.001f);
    gl.glVertex3f(1f,-1f,12.001f);
    gl.glEnd(); //Dünya'ya ait kodların bittiğini belirttik.


Son olarak ise Ay'ı oluşturmak kaldı. Ay da Güneş ve Dünya'ya benzer şekilde oluşturulduğu için Ay için uzun uzun anlatım yapmadan direkt olarak kodları yazacağım.

//Ay'a ait kodlar :
gl.glRotatef(aci,0f, 1f, 0f); //Ay'ın sahnesini Dünya ekseni etrafında döndürmek için.
gl.glTranslatef(0f, 0f, -20f); //Ay'ın sahnesi
gl.glColor3f(1f, 1f, 1f); //Ay'ın rengi
gl.glRotatef(aci1,0f,1f,0f); //Ay'ın kendi ekseni (Y ekseni) etrafında dönmesi için
       
//Ay'ı oluşturan kodlar :
GLUquadric ay = glu.gluNewQuadric();
glu.gluSphere(ay,3f,15,15);
glu.gluDeleteQuadric(ay);

//Ay'ın üzerindeki siyah kare : 
gl.glColor3f(0.0f, 0.0f, 0.0f);
gl.glBegin(GL_QUADS);      
gl.glVertex3f(1f,1f,3.001f);      
gl.glVertex3f(-1f,1f,3.001f);  
gl.glVertex3f(-1f,-1f,3.001f);
gl.glVertex3f(1f,-1f,3.001f);
gl.glEnd(); //Ay'a ait kodların bittiğini belirttik.


Buraya tıklayarak Java programlama diline ait olan OpenGL taslağını indirebilirsiniz. Taslağı indirdikten sonra kodların arasında benim belirttiğim alana, burada anlattığım kodları sırasıyla eklemeniz gerekmektedir.

 Bakınız :


Taslaktaki kodların açıklamaları karşılarında yazıyor ama siz o kodları standart olarak alabilirsiniz. Ay ve Dünya'nın Güneş sistemindeki hareketlerine ait kodlar bu konuda anlattığım kısımlardır. Konu ile ilgili düşünceleriniz, konu altına yorum olarak bırakabilirsiniz. İyi çalışmalar.

7 yorum:

  1. Taslak.java dosyasını ne ile açacağız? Not defteri, WorldPad vs. ile olmuyor galiba.

    YanıtlaSil
    Yanıtlar
    1. Windows kullanıyorsan Yeni Metin Belgesi veya Notepad++ gibi Not Defteri uygulamaları ile açabilirsiniz. Ubuntu tarzı Linux tabanlı işletim sistemi kullanıyorsanız Gedit ile açabilirsin.

      Sil
  2. bunu html de nasıl yapabiliriz acaba

    YanıtlaSil
  3. bilgisayar muhendsligi 1.sınıftayım ve bu projeyı html ve java scrıptte yazmamızz ıstenıyor pazartesı teslım etmem gerekiyor yardım edbılırmısınız lutfen

    YanıtlaSil
    Yanıtlar
    1. webGL kullanımını araştır ve öğren. İnternette bununla ilgili bir çok video var. WebGL'i öğrendikten sonra bu konuda anlattığım güneş sistemi mantığından yararlanarak, aynı işlemleri javascript ile yapman zor olmayacaktır diye düşünüyorum. İyi çalışmalar.

      Sil
  4. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  5. Merhaba ben dünyayı bildiğimiz dünya resmi ile kaplamak istiyorum ve güneş ışınlarını da eklemek istiyorum nasıl yapabilirim

    YanıtlaSil
Yorum Sayfası :


Yorum formuna konuyla ilgili görüş ve sorularınızı bırakabilirsiniz.

Yorumunuza mümkün olan en kısa sürede dönüş yapılacağından emin olabilirsiniz.


Eklenen yorumlar, moderatör onayından sonra yayınlanmaktadır.

BLOGKAFEM.NET © Copyright 2008-2023
Sitedeki yazıların her hakkı BLOGKAFEM.NET sitesine aittir.
Kopyalanması halinde lütfen kaynak gösteriniz.
DMCA.com Protection Status
Anasayfa | Hakkında | İletişim