dostum ellerine sağlık, ugraşlarına sağlık ben bir kaç yıl önce sistem yazılımları ile ugraşıyordum, minix çekirdeğini yeyip yuttuydum, güya geliştirecektim sonra hatun bıurakıp gidince bende yazılımı mazılımı bıraktım avare gibi ot içip içki içmeye başladım yeni yeni kendime geliyorum, burda bende sahip olduklarımı paylaşmak isterim hiç cesaret edemedim grafik programlaaya hep kendime uzun yıllara yayacağım bir oyun yazmak istemişimdir diablo tarzı belki hafif hafif başlarım ne dersin? benim iyi bir grafik kütüphanes, ne ihtiyacım var sdl işimi görür sanırım

Teorik Temelleri : Elimizdeki koordinatlardan şekil çıkaracağımız bu koordinatların nasıl birleşeceğini biz belirleriz ve bu belirlediğimiz yöntemlere göre aynı koordinatlardan farklı şekiller çıkabilir. SoFaceSet sınıflarında belirli koordinatlar yüzey oluşturur ve bu yüzeyler daha sonra birleşerek şeklimizi oluşturur. Dolayısı ile koordinatların nasıl yüzey oluşturacağı çok önemlidir. Şimdi bir örnek verelim, bu örneğimizde elimizde kübün köşe koordinatları olsun. Her yüzeyi üçgenlere bölerek gösterelim . Şimdi dikkat etmemiz gereken en önemli iki kuralı size açıklayayım: 1. Kural Vertexleri tararken saatin ters yönünde gitmemiz gerekir! 2. Kural Vertexleri tarama işimiz bittikten sonra tarayacağımız diğer vertex bir önceki vertexin komşusu olması lazım. Şekle bakınca ne demek istediğimi anlayabilirsiniz. Bir küp için bu çok kolaydır ama cismimiz karmaşıklaştıkça vertexleri tanımlamak için çok ileri matematiksel hesaplamalar yapmak gerekmektedir. SoFaceSet Nasıl Kullanılır? Şimdi geldik işin en zevkli kısmına! SoFaceSet sınıfı yukarı da belirttiğimiz gibi koordinat ve yüzey oluşturulma kuralını ister bizden. Bunun dışında renk gibi değişik özellikleri verebiliriz. Yukarıdaki örneğimiz için arrayleri oluşturalım: Kod: // ön yüzey için float koordinatlar ={ ,// 1. nokta ,// 2. nokta ,// 3. nokta... devam ediyor float vertices ={ , / 1. üçgen 1,2,4 noktalarını aldık -1 vertexin tamamlandığını belirtir / , / 2. üçgen 1,4,3 noktalarını sırası ile tanıtıyoruz... diğer üçgenleri de oluşturuyoruz Vertexleri Nesnemize Nasıl Tanıtırız? Kod: / diyelim ki elimizde Vertexler var bunu nesnemize eklemek için SoIndexedFaceSet faceSet = new SoIndexedFaceSet; şeklinde tanımlanmış FaceSet nesnemize faceSet->coordIndex. set1Value(1,2,4); şeklinde ekleyebiliriz, daha sonra 1,4,3 eklememiz gerekecektir / / SoIndexedFaceSet ve SoFaceSet nesneleri aynı görevi görürler tek farkları Indexed sınıfları doğrudan koordinatları kullanırken NonIndexed sınıfları vertexProperty sınıflarını kullanırlar. Bu sınıfı kullanmak istersek koordinatlar yerine vertexlerin özelliklerini tanımlamamız gerekecektir. İlk yazımda ki help dosyasından nasıl kullanılacağına bakabilirsiniz / Uygulama : Uygulamada elimizde belirli aralıkla yükseklik değerleri var ve bu yükseklik değerlerini kullanarak bir harita yapacağız. Bu örnekte yükseklikler bir text dosyasından okunuyor (her nokta arası x yönünde 40 metre y yönünde 30 metre) ve daha sonra bu text dosyasındaki noktalardan koordinatlar ve vertexler oluşturuluyor. Yukarıda verdiğim örnekteki kuralı takip ederek her 4 noktada bir 2 üçgen oluşturuluyor. Uygulamada vector ve matrix fonksiyonları Numerical Recipies kütüphanelerinin fonksiyonlarıdır. Matris ve vektör tanımlamak için kullanırız. Malloc veya new gibi komutlarla da bu işlem yapılabilir. Numerical Recipies kütüphanelerini bir başka yazıda inceleyeceğiz. yukarıda algoritmamızı görüyorsunuz sol yukardan saatin ters yönünde üçgenler çizerek sağa doğru ilerliyoruz daha sonra bir alta geçip üçgenleri sol taraftan oluşturmaya başlıyoruz. Kod: #include <Inventor/Qt/SoQt. h> #include <Inventor/Qt/SoQtRenderArea. h> #include <Inventor/Qt/viewers/SoQtExaminerViewer. h> #include <Inventor/SoDB. h> #include <Inventor/nodes/SoCone. h> #include <Inventor/nodes/SoCube. h> #include <Inventor/nodes/SoDirectionalLight. h> #include <Inventor/nodes/SoGroup. h> #include <Inventor/nodes/SoMaterial. h> #include <Inventor/nodes/SoPerspectiveCamera. h> #include <Inventor/nodes/SoRotation. h> #include <Inventor/nodes/SoSeparator. h> #include <Inventor/nodes/SoIndexedFaceSet. h> #include <Inventor/nodes/SoSphere. h> #include <Inventor/nodes/SoTranslation. h> #include <Inventor/nodes/SoCoordinate3. h> #include <Inventor/sensors/SoTimerSensor. h> #include <Inventor/actions/SoGLRenderAction. h> #include <qapplication. h> #include <qgroupbox. h> #include <qlayout. h> #include <stdio. h> #include <stdlib. h> #include "nr. h" #include "nrutil. h" void main { int i; int j; int x; int y; int count=0; FILE fpopen; // Yükseklikeri okuyoruz fpopen=fopen ; fscanf ; float values=matrix(0, x,0, y); float indice=vector(0, x y 8); for(j=0;j<y;j++) { for(i=0;i<x;i++) } printf you see the mountains "); QWidget myWindow = SoQt::init(argv ); if exit(1); // Ana nesnelerimizi oluşturup SoFaceSet nesnelerimizi de oluşturuyoruz. SoSeparator commonroot = new SoSeparator; commonroot->ref ; SoSeparator myObject = new SoSeparator; SoCoordinate3 myCoords = new SoCoordinate3; SoIndexedFaceSet faceSet = new SoIndexedFaceSet; // Teker teker koordinatları myCoords nesnesine ekliyoruz for (j=0;j<y;j++){ for(i=0;i<x;i++) } myObject->addChild ; // Vertexleri aşağıda oluşturuyoruz, Vertexler oluşurken sol baştan başlayıp sağa kadar // gittikten sonra bir aşağıya geçiyoruz bu sefer sağ baştan başlayıp sola kadar gidiyoruz // bu loopta soldan başlayıp sağa kadar gidiyoruz for(j=0;j<y-1;j++){ if ((j%2) 0){ for(i=0;i<x-1;i++) } // bir alt sıraya geçiyoruz yine aynı yöntemle üçgenleri oluşturuyoruz if ((j%2) 1){ for(i=x-1;i>0;i--) } } // herşey bittikten sonra nesnelerimizi üst nesnelere ekliyoruz myObject->addChild ; commonroot->addChild ; // Set up viewer: SoQtExaminerViewer myViewer = new SoQtExaminerViewer ; //SoQtExaminerViewer myViewer = new SoQtExaminerViewer ; myViewer->setSceneGraph ; myViewer->setTitle ; myViewer->show ; // Map window and start event loop. //SoQt::show ; SoQt::show ; SoQt::mainLoop ; //return 0; } Kodumuzu çalıştırınca : görüntüsünü elde ediyoruz. Görüntüler tanıdık geldi değil mi? Herhangi bir oyunda yüzey taramasında gördüğünüz yüzey taramaları aşağı yukarı bu yöntemlerle yapılıyor. Inventor gölge derinlik işlemlerini otomatik olarak ayarlıyor. Bize ise bu görüntüyü daha da renklendirmek kalıyor. Mr.666 & ÖzEren Kategorisi : C++ ve C++. NET Dili