Eminim herkes şu oyunlar nasıl yapılıyor yada şu film efektleri nasıl yapılıyor diye sormuştur. Bu yazıdan sonra 3D grafiklerin ne olduğunu kabaca öğrenmiş olacaksınız. Yazılarımızın diğer serilerinde ise 3D grafik çizimleri ile ilgili değişik uygulamalar yapacağız. 3D uygulamaları için Donanım olarak yeterli bir makineye sahip olmamız gerekir. Eskiden bu büyük bir sorundu ama artık standart ev makinelerinin ekran kartları yeterince güçlü ve temel 3D uygulamalarını zorlanmadan çalıştırabilmekteler. Yazılım olarak ise her 3D uygulaması ya işletim sistemi tabanlı ya da software tabanlı kaynaklara ihtiyaç duymaktadır. Herhangi bir 3D oyununuz Directx kullanarak da çalışabilirken bazen DirectX tek başına yeterli olmayabilir. 3D uygulamarı için OpenGL standardı gelmiştir. Burada Open free, açık anlamında GL ise Graphics Library anlamındadır. OpenGL kütüphaneleri SGI tarafından C/C++ dili kullanılarak yapılmıştır. Ancak OpenGL düşük seviyeli fonksiyonları içermektedir. SGI OpenGL kütüphanelerinin üzerine ayrıca Open Inventor adını verdiğimiz kütüphaneleri geliştirmiştir. Open Inventor ile C++ Object Oriented gücü ile yazılımlarımızı çok daha hızlı ve güzel geliştirebiliriz. Yazılarımızda Open Inventor toolkit' ini kullanacağız. Oyun ya da ileri grafik uygulamaları ya Open Inventor ya da Open Inventor tarzında daha gelişmiş grafik kütüphaneleri kullanmaktadır. Bu standart artık neredeyse heryerde kabul edilmiştir. Başka dilde geliştirilen kütüphaneler bile OpenGL veya Inventor kütüphanelerini temel almaktadır. Size şaşırtıcı gelebilir ama 3D graphics işinde matematik neredeyse geliştirdiğiniz projenin %50 sinden fazla zamanını alır. Bundan dolayı sağlam matematik temeli olmayan insanların 3D graphics de başarılı olmaları pek mümkün değildir. İleri yazılarımızda size simülasyonların temelini oluşturan matematiği ve bunların koda nasıl aktarılacağını göstereceğim. Başlamadan önce indirmeniz gerekenler : http://www.coin3d.org/download/ (linkinden SoQt 1, Coin 1, Simage-1 indirin ) ftp://ftp.trolltech.com/qt/non-commercial/QtWin230-NonCommercial. exe Bunları kurduktan sonra makineniz OpenGL ile neredeyse her türlü hayalinizi yapabileceğiniz duruma gelecektir. Ayrıca uygulamalarınızda yanınızdan ayıramayacağınız help dosyasını da buradan indirebilirsiniz tıklayın. ÇİZİM DEĞİL NESNE Görüntüleme sınıfları : QT ve XT QT ve XT Sınıfları görüntüleme için gerekli kütüphaneleri ve fonksiyonları barındıran en önemli sınıflardandır. Inventorun burada bize sağladığı en büyük yararlardan birisi de low level sınıflar ile herhangi bir şekilde bizi muhatap kılmamasıdır. Herşey kullanıcıya kolaylık sağlayan arayüzler ile halledilmektedir. Şimdi XT veya QT kütüphanelerinin fonksiyonlarını nasıl kullanabiliriz onları bir tanıtalım. Aşağıda gördüğünüz kod SGI grafik uygulamalarında yer alan en temel örnektir! Ekran açmaktan başka hiçbirşey yapmaz. Dilerseniz header' ları ve içeride kullandığımız fonksiyonları inceleyelim. Inventor/SoQt. h headerimiz 3D uygulamaları için gerekebilecek temel sınıfları ve fonksiyonları barındıran en önemli class' tır. Aklınıza gelebilecek her türlü işlem için SoQt header' ı içindeki fonksiyonlara ve tanımlara başvurulacaktır. Detaylarında kaybolmayın, 3D uygulamaları için C++ gurusu olmanız gerekmiyor! Window ve Viewer : Kod: // Herhangi bir yerde bulabileceginiz en basit SGI uygulaması // Ana kütüpaneler için SoQt headerini ekliyoruz #include <Inventor/Qt/SoQt. h> // Viewer için Qt nun Viewerini kullanıyoruz // Plane viewer, full viewer, fly viewer gibi birçok değişik viewer daha vardır. // Biz görüntüleri #include <Inventor/Qt/viewers/SoQtExaminerViewer. h> main Nesneleri oluşturuyoruz!! Buraya kadar herşey kolaydı sadece bir window açtık ve examinerviewer dediğimiz görüntüleme aracını oluşturduk. Şimdi dünyamızı oluşturmak için neler yapmamız gerekiyor onlardan bahsedeceğim. Yukarı da bahsettiğim gibi grafik programlama da çizim diye bir şey yoktur herşey nesnedir. 3D dünyamızda herşeyi nesnelerle tanımlamaktayız. Nesnelerimizin renk, pozisyon, malzeme,... gibi aklınıza gelebilecek çeşitli özellikleri vardır. İşleri daha basitleştirmek için ve aynı dili konuşmak için ise OpenGL notasyonu geliştirilmiştir bu sayede hem kod geliştirici hem de işin teorik kısmını geliştirenler birbirleri ile daha iyi anlaşabilirler. İçi boş veya sadece düz çizgi olan bir daire üst nesneleri tanımlarken birbirine dönük oklu daireler ise pozisyonları tanımlamaktadır. Bundan sonraki yazılarımızda bunlara daha da aşina olacaksınız. Bu bir standart olarak kabul edilmiş ve böyle uygulanmaktadır. Aşağıda ki uygulamamızda su molekülünü modelliyoruz. Inventor su moleküllerine low-level bir uygulama olarak değil bir kimyacı gibi bakmaktadır (elimde 2 küçük 1 tane büyük küre var renkleri şu, uzayda pozisyonları...). Elbette işin detayında low-level olarak yapılmaktadır bütün işlemler. Nesneleri örnek kodumuzu yazarken daha detaylı inceleyeceğiz. Inventor notasyonuna uygun bir şekilde bir su molekülü görmektesiniz. En üst kısımda bir su molekülü var. Daha aşağılara indiğimiz zaman ise atomlar ve atomların pozisyon, şekil, renk gibi aklınıza gelebilecek özellikleri tutan nesneler vardır. Peki en can alıcı soruyu sorma vakti geldi su molekülü ve atomlar nasıl bir nesne Inventor dilinde? Nasıl oluşturulmaktadır? SoSeparator : Inventor da herşey SoSeparator nesnesinin altındadır. Yukarıda gördüğünüz örnekte molekül ve atomların hepsi birer SoSeparator nesnesidir. SoSeparator nesnesi alt seviyede özellikleri olan nesneleri barındıran büyük bir nesnedir. Elimizde 100 lerce separator nesnesi olabilir. Örnek olarak yukarıda 3 atom, 1 molekül var yani toplamda 4 tane separator nesnemiz var. Separator nesnesine nesne eklemek için addChild adını verdiğimiz bir fonksiyonu kullanacağız. Bu fonksiyonun kullanımı şöyledir : Kod: void addChild addChild dışında, removeChild, replaceChild gibi değişik fonksiyonlar da vardır. Örneğimizde bu metodlar daha da pekişecektir. SoTransform : Haklı olarak moleküllerimizin pozisyonları da olacak. Bunlar pozisyonlar SoTransform nesnelerinin sorumluluğundadır. Örneğinz trans1 isimli SoTransform tipinden bir nesnemiz olduğunu varsayalım. Eğer trans1 nesnesinin sadece x doğrultusunda olmasını istersek : Kod: trans1->translation. setValue(1.0,0.0,0.0) yazarak işlemimizi gerçekleştirebiliriz. Help dosyasından bakarak diğer fonksiyonlara erişebilirsiniz. SoCube, SoSphere, SoCone,... : Inventor SoCube SoSphere gibi şekil özelliklerini barındıran nesneler ile zorlanmadan küre, küp, koni,... çizmemizi sağlamaktadır. Ayrıca bu nesnelerin fonksiyonları bunların yarıçaplarını, uzunluklarını,... değiştirmemize izin vermektedir. SoMaterial : SoMaterial nesnesi ile cismimizin rengini, transparan görünüşünü, parlaklığını ayarlayabiliriz. Bunun dışında SoMaterial nesnesinin kullanabileceği değişik fonksiyonlar daha vardır. ONEMLI NOT!!! Kullandığınız her nesne için yukarıya headerini eklemeyi unutmayın! Header path' i help file da bulabilirsiniz. Mr.

Kod Yazma Zamanı! Kod: // görüntüleme aracı için gerekli kütüphaneler #include <Inventor/Qt/SoQt. h> #include <Inventor/Qt/viewers/SoQtExaminerViewer. h> // kullandığımız nesneler için gerekli kütüphaneler // kullandığımız her So ile başlayan nesne için gerekli headerleri help file ile bulup ekleriz #include <Inventor/nodes/SoMaterial. h> #include <Inventor/nodes/SoSeparator. h> #include <Inventor/nodes/SoSphere. h> #include <Inventor/nodes/SoTransform. h> // standart c kütüphaneleri #include <stdlib. h> #include <stdio. h> void main İşimiz bittikten sonra görüntümüz böyle olacaktır. Yukarıda bilmenin ve dikkat etmeniz gereken tek şey, nesnelerin fonksiyonlarına nasıl ulaşabiliriz ve ulaştıktan sonra o nesnenin özelliklerini nasıl değiştirebiliriz. Ayrıca nesneleri eklerken yazımın başında verdiğim yönteme göre sıraya dikkat edilmesi gerekmektedir. Yani Separator nesnelerinin altına özellikleri eklemeliyiz. Bu konularla ilgili internette bol miktarda referans var aşağıda verdiğim gibi buralardan güzel bir başlangıç yapabilirsiniz. Örnek kodları indirmek için tıklayın Mr.666 1337 Kategorisi : C++ ve C++. NET dili