Üç Boyutlu Binaların Web Üzerinde Otomatik Olarak JOGL ile Modellenmesi

Kategoriler:

1. Giriş

JOGL, Java tabanlı OpenGL destekli grafiksel uygulamalar geliştirmek için, açık kaynak kod projesi şeklinde geliştirilip ortaya çıkarılmış bir programlama arayüzüdür. JOGL kullanılarak oyunlar, etkileşimli egitim amaçlı uygulamalar, grafiksel modelleme/tasarım yapılabilen editörler vb. geliştirilmektedir.[7] [8] [9]

JOGL'un çalısma mantıgı, C programlama dili ile yazılmış OpenGL kütüphanesine ait yordamların, arka planda JNI ('Java Native Interface') kullanılarak çagrılması çerçevesi üzerine oturtulmuştur. Dolayısıyla JOGL'un kullanılmak istendigi platform, OpenGL'in çalıstırılmasını desteklemelidir. JOGL, Java üzerinden OpenGL kullanımını saglayan Java3D, GL4Java gibi diger uygulama programlama arayüzlerinin aksine; OpenGL çagrılarını belirli bir kaç sınıfın içerdigi metodların prosedürel olarak çagrılması şeklinde kullanımına imkan vermekte; sonuçta bu tarz bir yaklaşım daha hızlı bir şekilde grafiksel görüntüleme yapılmasına büyük katkı saglamaktadır.

Yapılan bu çalısmamızda, kullanıcının belirttigi kat sayısı ve kat uzunluk, genişlik ve derinlik parametrelerine göre otomatik olarak üç boyutlu bir binanın modeli hızlı bir şekilde oluşturulmaktadır. Kullanıcılar geliştirdigimiz bu yazılım sayesinde internet üzerinde oluşturdukları bu modelleri, üç boyutlu (3B) temel dönüsüm islemlerini (tasıma, döndürme, ölçeklendirme) uygulayarak etkileşimli olarak inceleyebilmektedirler.

2. Java Tabanlı 3B İçerik oluşturma Kütüphanelerinin Karsılaştırılması

Java programlama dili ile üç boyutlu içerik oluşturmanın temelleri ilk defa 1996 yılında Intel, Silicon Graphics, Apple ve Sun firmalarının girisimiyle baslamıştır. 1998 yılı sonlarında Java3D'nin ortaya çıkısı ile baslayan süreç, 2000 yıllarında GL4Java'nın ve 2003 – 2004 döneminde Java3D'nin gelişimine ara verildigi sırada JOGL'un ortaya çıkısı ile farklı bir boyut kazanmıştır. [6]

JOGL vs. Java3D

Java'da, 3D içerik oluşturmada, JOGL öncesi kullanılan en yaygın uygulama programlama arayüzü Java3D'dir. Günümüzde Java3D ile geliştirilmis bir çok grafiksel uygulama mevcuttur. Java3D'nin çalısma mantıgı, agaç veri yapısında yer alan dügüm gruplarının genel görüntüleyici tarafından belirlenen hiyerarsik yapıya göre grafiksel içerigin oluşturulması şeklinde belirlenmistir. Bu yaklaşım, uygulama geliştiriciler açısından programlama seviyesinde kolaylık getirirken, uygulamaların çalısma hızının düsük olmasına sebep olmaktadır. Ayrıca grafiksel ögelerin oluşturulmasında OpenGL'de oldugu kadar gerçekçilik verilememektedir. JOGL, hız ve gerçekçiligin arttırılması ve uygulamalardaki belirsiz hatalar ile uyumsuzlukların giderilmesi sonucu; Java3D'nin belirtilen eksikliklerini kapatarak, 3D içerik oluşturmada daha etkin bir çözüm durumuna gelmistir.

JOGL vs. LWJGL

JOGL 'a alternatif olabilecek belli baslı uygulama programlama arayüzlerinden biri de LWJGL ('Lightweight Java Game Library')'dir.Bu kütüphane Microsoft DirectX 'in Sun Java tarafındaki karsılıgı olarak düsünülebilir. [10]

Her iki kütüphane de arka planda yapılacak bir çok isi kendi yapıları içindeçözümlemektedirler ancak LWJGL kendi pencere sistemi üzerinden çalıstıgından var olan Java uygulamaları ile birlestirilmesi pek de kolay degildir. Ayrıca JOGL, Java'nın AWT, Swing gibi bilesenleriyle rahatlıkla birlestirilerek kullanılabilir. LWJGL grafiksel bir uygulamayı geliştirmek için hazır bir paket gibi kullanılabilirken JOGL sadece grafikselögelerin görüntülenmesinde kullanılır.

Örnegin ses ve ses efekti islemleri için JOAL('Java Open Audio Library') ve girdi kontrolü (klavye, fare, oyun çubugu vb.) için JInput kütüphaneleri kullanılarak bütünsel sonuca gidilebilir. [2]

3. JOGL ile Web Tabanlı Etkileşimli 3B Uygulamalar Geliştirme

3.1 JOGL Kurulum

Geliştirilen uygulamaların çalıstırılması için yapılması gereken kurulum islemleri çogu zaman kullanıcıları ve uygulama geliştiricileri sıkmaktadır. Özellikle JOGL'un kurulumunda bu sıkıntıların yasandıgı görülmektedir. Kurulumda bazı püf noktalarının eksiksiz yerine getirilmesi gerekmektedir. [1]

Kurulum ile ilgili dosyaları projenin https://jogl.dev.java.net sitesinden indirdikten sonra asagıdaki islemler yapılarak geliştirme/test ortamı hazırlanabilir :

• İndirilen sıkıstırılmış haldeki dosya içerisindeki sistem kütüphanelerinin (windows için *.dll, linux için *.so uzantılı olmak üzere) Java çalısma ortamının kuruldugu dizin altındaki '/bin' dizini altına kopyalanması
• *.jar uzantılı uygulama programlama arayüzü kütüphane dosyalarının ise Java çalısma ortamının kuruldugu dizin altındaki '/lib/ext' dizini altına kopyalanması

Örnegin windows yüklü bir makinada Java çalısma ortamının yüklü oldugu dizini C:\Java\jre1.5.0_08 olarak ele alırsak 'jogl.dll', 'jogl_awt.dll', 'jogl_cg.dll' dosyaları C:\Java\jre1.5.0_08\bin altına; 'jogl.jar' dosyası ise C:\Java\jre1.5.0_08\lib\ext altına kopyalanmalıdır.

Günümüzde 'Eclipse', 'JBuilder', 'IntelliJ', 'NetBeans'... vb. bir çok Java uygulama geliştirme editörü kullanılabilmektedir. Kullandıgımız editörden sistemimizde yüklü olan Java çalısma ortamını JOGL kurulumunda kullandıgımız çalısma ortamı olarak belirledigimiz anda, JOGL uygulamalarımızı geliştirebilecek ve test edebilecek sartlar saglanmış olacaktır.

Kurulumun basarı ile gerçeklesip gerçeklesmedigini ögrenmek amacıyla asagıdaki gibi basit bir test kodu çalıstırılabilir

“System.loadLibrary("jogl");”

Bu kod satırının, 'UnsatisfiedLinkException' gibi bir istisna fırlatması; Java çalısma ortamının sistem kütüphanelerini bulamaması sonucudur. Kurulum yeniden gözden geçirilmelidir.

3.2 JOGL Genel Sınıf Yapısı

Asagıda JOGL içerisindeki temel sınıf ve arayüzler ('interface') kısaca açıklanmaktadır :

- javax.media.opengl.GL OpenGL'e erisim için kullanılan temel arayüz sınıfıdır. Grafiksel içerigi tutar.
- javax.media.opengl. GLAutoDrawable Olay tabanlı isleme mekanizması temelinde görüntülenme isleminin yapılmasını saglayan arayüz sınıfıdır.
- javax.media.opengl. GLEventListener Uygulamada etkileşim sırasında görüntülemeyi degistirebilecek olayların görüntülemeye olan etkişini saglayan arayüz sınıfıdır.
- javax.media.opengl.GLCanvas AWT pencere sistemi üzerinden grafiksel ögelerin görüntülenmesini saglayan agır bir komponenti tanımlayan sınıftır.
- javax.media.opengl.GLJPanel Swing üzerinden grafiksel ögelerin görüntülenmesini saglayan hafif bir komponenti tanımlayan sınıftır.
- javax.media.opengl.GLCapabilities Sistemde kurulu olan OpenGL üzerinden,görüntüleme asamasında nelerin yapılması gerektigini belirleyen sınıftır.

JOGL kütüphanesinde bunların haricinde bir çok sınıf bulunmaktadır. şekil - 1'de üç adet farklı renkteki (kırmızı, yesil ve mavi) disliçarkın JOGL kullanılarak birbirine bagımlı olarak dönme olayını örnekleyen uygulamanın ekran görüntüsü verilmistir :

Image

Şekil 1. JOGL Gears Demo Ekran Görüntüsü

4. Web Tabanlı Üç Boyutlu Bina Modelleme

İnternetin hızlı bir Şekilde büyümesi ile birlikte kullanıcılar, günlük hayatlarındaki birçok islemlerini internet üzerinden gerçeklestirmeye baslamışlardır. Bir çok firmaürün ve hizmetlerini internet üzerinden pazarlamaktadır. Bu yaklaşım; insanların, alacagı ürün veya hizmetler için görsel yönden güçlü tanıtımları talep etmelerine ön ayak olmuştur. Böylece internet üzerinden yayınlanabilecek iki veya üç boyutlu grafiksel içerik oluşturma gereksinimlerini karsılayacak yeni yapıların ortaya çıkması saglanmıştır. Java, Java3D ve JOGL'un JApplet teknolojisiüzerinden kullanılmasına imkan saglayarak bu gereksinimi etkin bir şekilde karsılamaktadır.

İki boyutlu grafikler yıllardır internetin ve popüler yazılımların (kelime islemciler, tablolama yazılımları, sunum yazılımları) dogal bir parçası olarak kullanılmaktadır. Üç boyutlu grafikler ise;

• Bilgisayar Destekli Tasarım ve Bilgisayar Destekli Üretim
• Bilim ve Bilimsel Görsellestirme
• Egitim ve Ögretim
• Eglence
• Reklamcılık
• Sanat
• Sanal Gerçeklik ve Güçlendirilmis Gerçeklik gibi bir çok alanda kullanılmaktadır. [3]

Üç boyutlu modelleme genel olarak yukarıdaki baslıkların tümünde kullanılan genel uygulamalardan biridir. 3B olarak modellenecek bir binanın var olan çizim veya modelleme programlarıyla herhangi bir birey tarafından ortaya çıkarılması çok kolay olmayan bir süreçtir.

Binaların üç boyutlu olarak otomatik bir şekilde modellenmesinde prosedürel programlama yaklaşımının kullanımı son yıllarda önem kazanmaktadır. Özellikle asagıdaki soruların tatmin edici cevaplarının elde edilmesi bu yaklaşımın dogrulugunu kanıtlayabilecek nitelikte olacaktır :

- Bu tarz uygulamalar geliştirmek için hangi şekilde prosedürel programlama yapmak gerekir?
- Gerçek zamanlı bina oluşumunu saglayabilmek için geliştirilen kapsamlı bir uygulama yeterince hızlı sonuç üretebilir mi?
- Mimari açıdan ne kadar dogru ve görsel açıdan ne ölçüde inandırıcı sonuçlar elde edebiliriz?
- Gerçek zamanlı görüntülemede prosedürel yaklaşım aynı anda bir çok binayı farklı detay seviyesinde görüntüleyebilecek kadar yetenekli olabilir mi? [5]

Web tabanlı mimari görsellestirmede iki ve üç boyutlu teknolojileri bütünlestirençalısmalardan birisinde de, SVG ve X3D/VRML arayüzleri kullanılmıştır. [4]

5. Çok Katlı Üç Boyutlu Bina Modelleme Çalısması

Bu makalede örneklenen çalısma ile 3B modelleme bilgisi olmayan herhangi bir bireyin; binanın kat sayısı, her kattaki asansör ve merdiven sayısı gibi temel parametreleri kullanıcı dostu bir arayüzden girerek, otomatik olarak 3B binayı oluşturabilmesi saglanmıştır. Ayrıca fare kullanımı ile binanın herhangi bir açıdan döndürülerek görüntülenebilmesi ve klavyeden yön tusları kullanılarak binanın pozisyonunun güncellenebilmesi imkanları sunulmuştur. Böylece kullanıcı verdigi parametrelerin degismesine göre ne tip bir 3B bina modeli ortaya çıkabilecegini hızlı ve pratik bir şekilde görebilmektedir.

Geliştirdigimiz uygulamada, otomatik bina oluşturma yaklaşımı, önceki çalısmalardan farklı olarak; JOGL ile ilk defa web üzerinde uygulanmıştır.

Uygulamada şekil - 2'de gösterildigi gibi kullanıcıdan bina kat sayısı ve her bir katın uzunluk, en ve tavan yükseklik degerini belirtmesi beklenmektedir

Image

şekil 2. Bina kat parametreleri

Kullanıcının girdigi temel parametrelerin dısında, her bir kat için istenildigi takdirde; belirtilen sayıda, kata ait hedef noktası,merdiven ve asansör yerlestirilebilmektedir. (şekil 3.)

Image

şekil 3. Binanın ilk katı için kat parametreleri

Örnegin şekil - 3'de binanın birinci katı için 'T' harfi ile kırmızı renkte belirtilen elemanlar 2 adet hedef noktasını, 'L' harfi ile turuncu renkte belirtilen elemanlar 2 adet asansörü ve 'SC' ifadesi ile belirtilen mavi renkteki elemanlar ise merdivenleri göstermektedir. Parametrelerin dagılımı ve yerlestirilmesi kullanıcının siyah renk ile belirtilen alanı, ilgili parametre tipini seçtikten sonra tıklaması ile yerlestirilebildigi gibi; 'Random' butonuna basılarak da istenilen sayıda rastgele elemanın dagıtılması şeklinde de yapılabilmektedir. Yukarıdaki gibi ilgili parametreler girildikten sonra binanın oluşturulması istendiginde,öncelikle yukarıdaki Swing JPanel'inde yer alan parametrelerin koordinat degerleri JOGL'un koordinat sistemine göre normalize edilerek pozisyon degerleri güncellenmektedir. Bu isleme ait temel kod blogu söyledir :

X, Z eksenlerine ait normalize edilmis koordinatların bulunması :

// Z ekseni için...public float getZCoordinateValue(float floorWidth, float normalizedZ) {

float returnValue = -1;

returnValue = floorWidth * normalizedZ * 0.5f;

return returnValue;

}



// X ekseni için...

public float getXCoordinateValue(float normalizedX, float floorLength) {

float returnValue = -1;

returnValue = Math.abs((floorLength/2) - (normalizedX * floorLength));

returnValue;

}

Y ekseni için binanın her katının tavan yükseklik degeri referans kabul edildiginden bu eksende herhangi bir dönüsüm islemine gerek kalmamıştır.

Bina çiziminde öncelikle her bir kat tel kafes ('wireframe') küp şeklinde her bir kenarı farklı renkte olmak üzere çizdirilmistir. Daha sonra her bir katın kendisine ait parametreleri sırasıyla iterasyonlarla çizdirilerek sonuca ulaşılmıştır.

Bina kat sayısı kadar iterasyonda her bir katın çizdirilmesi

mainDisplayList= gl.glGenLists(1);



gl.glNewList(mainDisplayList, GL.GL_COMPILE);

for (int i = 0; i<=building.getFloorCount() - 1; i++)

{

drawFloor(building.getFloor(i));

}



gl.glEndList()

Bir katın tabanı ile çizdirilmesini örnekleyen kod blogu ('drawFloor') :

gl.glColor3d(



Math.random(),

Math.random(),

Math.random());

gl.glTranslatef(0,

building.getFloorHeight(), 0);



/*

Poligon Çizici sinifimiz

kullanilarak kat çizdiriliyor...

*/



polygonDrawer.drawWireCube(building.getFloorLength(),building.getFloorHeight(),building.getFloorWidth());

gl.glPushMatrix();

gl.glTranslatef(0, building.getFloorThick()/2 - building.getFloorHeight()/2, 0);

gl.glScalef(1, building.getFloorThick(), 1);



/*

Poligon Çizici sinifimiz kullanilarak

kat tabani çizdiriliyor...

*/



polygonDrawer.drawSolidCube(

building.getFloorLength(),

building.getFloorThick(),

building.getFloorWidth());

gl.glPopMatrix();

Dönüsüm İslemi Örnegi (Matris Kullanımı) :

gl.glPushMatrix();



gl.glTranslatef(

newPoint.getX(),

building.getFloorHeight()/

(MFTSPUtility.TARGET_SCALE_RATE*

building.getFloorHeight()/2),

newPoint.getZ());



gl.glScalef(

building.getFloorLength()/

MFTSPUtility.TARGET_SCALE_RATE,

building.getFloorHeight()/

MFTSPUtility.TARGET_SCALE_RATE,

building.getFloorWidth()/

MFTSPUtility.TARGET_SCALE_RATE);



glut.glutSolidCube(1);

gl.glPopMatrix();

Yukarıdaki kod blogunda; var olan grafiksel içerigin 'glPushMatrix' metodu ile korunmasından sonra 'glTranslatef' metodu ile x, y ve z eksenlerinde öncelikle tasıma dönüsüm islemi yapılmış ve daha sonra üç eksen üzerinde de 'glScalef' metodu ileölçeklendirme islemi gerçeklestirilmistir. Bir birim ayrıt uzunluguna sahip birim küp nesnesi bu dönüsümleri kendi üzerinde yansıtacak şekilde 'glutSolidCube' metodu ileçizdirilerek, 'glPopMatrix' metodu ile bu islemlerin basında korunan grafiksel içerik yeniden gösterilmektedir.

Asagıda, uygulamanın etkinligi için kullanılan 'Display List' teknigi örneklenmektedir :

Görüntüleme Listesi Kullanımı ('Display List')

mainDisplayList = gl.glGenLists(1);



gl.glNewList(mainDisplayList, GL.GL_COMPILE);

for (

int i = 0;

i<= building.getFloorCount() - 1;

i++) {

drawFloor(building.getFloor(i));

}



gl.glEndList();

Uygulamanın Ürettigi Farklı Bina Görüntü Örnekleri
2 Katlı Bina Model Örnegi (şekil 4.) :
(1. Kat : 3 adet hedef noktası, 1 adet asansör)
(2. Kat : 1 adet hedef noktası, 1 adet asansör, 1 adet merdiven)

Image

şekil 4. 2 Katlı Bina Model Örnegi

5 Katlı Bina Model Örnegi (şekil 5.) :
(1. Kat : 6 adet hedef noktası, 2 adet asansör, 1 adet merdiven)
(2. Kat : 2 adet hedef noktası, 1 adet asansör, 1 adet merdiven)
(3. Kat : 1 adet asansör)
(4. Kat : 4 adet hedef noktası, 2 adet asansör)
(5. Kat : 3 adet hedef noktası)

Image

şekil 5. 5 Katlı Bina Model Örnegi

6. Sonuçlar

6.1 Grafik Arayüzlerinin Karsılaştırılması

Uygulama geliştirilirken JOGL dısındaki grafiksel içerik oluşturma kütüphaneleri ve teknikleri gerçeklestirim sırasında kullanılan teknikler bazında irdelenerek karsılaştırılmıştır. Elde edilen sonuçlar belirlenen baslıklar açısından Tablo - 1'de listelenmektedir :

Tablo 1. - JOGL, Java3D, OpenGL kütüphanelerinin karsılaştırılması

 JOGLJava3DOpenGL
Grafiksel İçerik KalitesiÇok İyiİyiÇok İyi
Görüntüleme HızıİyiOrtaÇok İyi
Programlama KolaylıgıİyiÇok İyiOrta
Platform UyumluluguİyiİyiÇok İyi
Web Yayınlama KolaylıgıÇok İyiÇok İyiAz
Farklı Uygulamalarla Ortak ÇalısabilmeİyiİyiÇok İyi

Gerçeklestirilen bu uygulama sonucunda JOGL'un web tabanlı üç boyutlu içerik oluşturmada gayet basarılı oldugu anlaşılmıştır. OpenGL ve Java ortamlarının birlestirilerek web üzerinden kullanılabilmesini saglaması, bir çok projenin daha çok kişiye; çok daha hızlı bir şekilde ulaşabilmesini saglayacaktır. Java geliştiricileri üç boyutlu grafiksel programlamayı rahatlıkla kullanabileceklerdir.

6.2 Programın Web Tabanlı Bina oluşturma Sürecine Etkişi

Özellikle, üç boyutlu etkileşimli olarak geliştirilen grafiksel uygulamaların webüzerinden kullanılması, anlatılmak istenen konuyu; bu konu hakkında hiç bir bilgisi olmayan kullanıcılara dahi kolay bir şekilde sunabilmesi bakımından önemli bir hale gelmistir.

Geliştirilen uygulama Java'nın 'Web Start' teknolojisi kullanılarak internet üzerinden kullanılabilir hale getirilmistir. http://yzgrafik.ege.edu.tr/projects/MFVis adresinden uygulama etkileşimli olarak kullanılabilir. Bu yaklaşım, çözümün daha hızlı ve kolay bir şekilde kullanıcıya sunulması bakımından önemlidir. Günümüzde bir çok uygulama web hatta mobil tabanlı çalısabilecek şekilde geliştirilerek bilgiye erisimdeki sınırların kalktıgı örneklenmektedir.

Kullanıcıların, istedikleri bir bina modelini, internet üzerinden kolaylıkla oluşturabildikleri gözlemlenmistir. Yazılım geliştiriciler açısından ise, OpenGL altyapısının kullanılması sayesinde çok karmasık modeller hızlı bir şekilde oluşturularak, üzerlerinde islemler yapılabildigi anlaşılmıştır.Çalısmamızda, desen kaplama (‘Texture Mapping’), hazır 3B model yükleme (‘3D Object Loading’) ve karmasık aydınlatma (‘Illumination Effects’) gibi modüllerin eklenmesi asamasına gelinmistir. Böylece uygulama, mimari ve görsel açıdan daha gerçekçi bina modellerini de destekleyecektir. Arka planda OpenGL kullanılması, gerçekçiligi ve hızı arttırırken; nesneye dayalı programlama yaklaşımı da programlama asamasında harcanan çabayı minimum düzeye indirerek daha etkin bir şekilde uygulama geliştirilebilmesini saglamaktadır. Buözellikleri sayesinde, gelecekte JOGL'un kullanım oranı artacak ve degisik alanlardaki yazılım geliştiriciler tarafından tercih edilecektir.

7. KAYNAKLAR

[1]. Canroy, K., JOGL : A Beginner's Guide and Tutorial, 2 Eylül 2004.
[2]. Twilleagear, D., Kesselman, J., Goldberg, A., Petersen, D., Soto, C. J., Melişsinos, C., Java Technologies for Games.
[3]. Ugur, A., Bilgisayar Grafikleri Ders Notları, EGE Üniversitesi, Bilgisayar Mühendisligi Bölümü, 2002 – 2003.
[4]. Wei, Y., Integrating web 2D and 3D technologies for architectural visualization: applications of SVG and X3D/VRML in environmental behavior simulation, Web3D 2006: 11th International Symposium on 3D Web Technology, 2006.
[5]. Whelan, G., Automatic Building Generation, Institute of Technology Blanchardstown, Graphics and Gaming Group, 2006.
[6]. Xu, Z., Yen, Y., Chen, X. J., OpenGL Programming in Java .
[7]. JOGL : Java Bindings for OpenGL, https://jogl.dev.java.net
[8].Nehe Productions, http://nehe.gamedev.net
[9].OpenGL, http://www.opengl.org, SGI
[10]. Sun Developer Network, http://java.sun.com, Sun Microsystems

Hazırlayan : Aybars UGUR, Eray HANGÜL, Tahir Emre KALAYCI, Dogan AYDIN

Kategoriler: