C#nedir?com
 
YAZAR HAKKINDA
Özkan Eren
Özkan Eren
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
6 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: #include baslayip eldeki elimizde inceleyecegiz. koordinatlar koordinatlari kullanarak nesnelerimizi nesnemize siniflari siniflarini sofaceset tanimlamak yazimda C++ / C++.NET Özkan Eren
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C++ / C++.NET
Yayınlanma Tarihi : 5.7.2005
Okunma Sayısı : 27161
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
Conda install environment.yml Package 23.10.2019
Turhal Temizer 'in Blogu
Mac OS/X Removing CUDA 23.10.2019
Burak Selim Şenyurt
Bu Sefer Bir React Uygulamasını Heroku Üzerine Alalım 23.10.2019
Burak Selim Şenyurt
Azure SignalR Servisini Kullanmak 23.10.2019
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
3D Grafik Programlama 3 : SoFaceSet Sınıfları,Vertexler
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Geçen yazımızda SoNurbs sınıflarını incelemiştik ve eldeki kısıtlı sayıdaki koordinatlardan nasıl eğriler elde edebileceğimizi ve bu eğrilerin şeklini belirlemiştik. Şimdi ki yazımda ise SoFaceSet sınıflarını inceleyeceğiz. SoFaceSet sınıfları eldeki texture, material, coordinat vb. özellikleri kullanarak bize görüntüyü verir. Herhangi bir oyunda karşılaştığınız bir görüntü ekseriyetle SoFaceSet tarzı sınıflarla oluşturulmuştur. Sınıflarımız kabaca tanımlamak gerekirse koordinatları rastgele birleştirmekten ziyade bizim tanımladığımız kurala göre yüzey oluştururlar. İşin en kafa karıştırıcı kısmıdır. Örneğimizde detaylı olarak üzerinden geçeceğiz. 

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 (en kolay gösterim şekli olduğu için istersek beşgen,altıgen de yapabiliriz). Şimdi dikkat etmemiz gereken en önemli iki kuralı size açıklayayım:



1nci Kural  Vertexleri tararken saatin ters yönünde gitmemiz gerekir !
2nci 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:

// ön yüzey için

float koordinatlar[8][3]={ { 0,0,0} ,// 1.nokta

                                   { 1,0,0} ,// 2.nokta

                                   { 0,1,0} ,// 3.nokta ...... devam ediyor

float vertices[12] ={ { 1,2,4,-1 } , /* 1.üçgen 1,2,4  noktalarını aldık -1 vertexin tamamlandığını belirtir  */

                             { 1,4,3,-1} , /* 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?

/* diyelim ki elimizde Vertexler var (yukarıda ki vertices değerleri) 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 (üçgenlik,beşgenlik gibi )ö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.

#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 argc, char **argv)
{
    int i;
    int j;
    int x;
    int y;
    int count=0;

    FILE *fpopen;

    // Yükseklikeri okuyoruz
    fpopen=fopen("heights.txt","r");
    fscanf(fpopen,"%d\t%d",&x,&y);

    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++)
        {
            fscanf(fpopen,"%f\t",&values[i][j]);
        }
    }

    printf("flip the black thing on screen :) you see the mountains ");

    QWidget *myWindow = SoQt::init(argv[0]);
    if (myWindow == NULL) 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++){
            myCoords->point.set1Value(i+x*j,(i%x)*40,(j%y)*30,values[i][j]);
        }
     }
 
     myObject->addChild(myCoords);

     // 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++){
                // ilk üçgeni oluşturmak için bir aşağıya sonra bir yana gidiyoruz
               faceSet->coordIndex.set1Value(count++,i+j*x);
               faceSet->coordIndex.set1Value(count++,i+x+j*x);
               faceSet->coordIndex.set1Value(count++,i+1+j*x);
               faceSet->coordIndex.set1Value(count++,-1);

               // completed first triangle

                // aynı şekilde diğer üçgeni de oluşturmak için saatin ters yönünde ilk üçgenle bitişik olacak şekilde yürüyoruz

               faceSet->coordIndex.set1Value(count++,i+x+j*x);
               faceSet->coordIndex.set1Value(count++,i+x+1+j*x);
               faceSet->coordIndex.set1Value(count++,i+1+j*x);
               faceSet->coordIndex.set1Value(count++,-1);
               }
           }

        // bir alt sıraya geçiyoruz yine aynı yöntemle üçgenleri oluşturuyoruz

       if ((j%2)==1){
           for(i=x-1;i>0;i--){
     
           faceSet->coordIndex.set1Value(count++,i+j*x);
           faceSet->coordIndex.set1Value(count++,i+x-1+j*x);
           faceSet->coordIndex.set1Value(count++,i+x+j*x);
           faceSet->coordIndex.set1Value(count++,-1);

           // completed first triangle

           faceSet->coordIndex.set1Value(count++,i+j*x-1);
           faceSet->coordIndex.set1Value(count++,i+x-1+j*x);
           faceSet->coordIndex.set1Value(count++,i+j*x);
           faceSet->coordIndex.set1Value(count++,-1);
           }
       }
  }
  

    // herşey bittikten sonra nesnelerimizi üst nesnelere ekliyoruz

      myObject->addChild(faceSet);
     commonroot->addChild(myObject);

      // Set up viewer:
      SoQtExaminerViewer *myViewer = new SoQtExaminerViewer(myWindow);
      //SoQtExaminerViewer *myViewer = new SoQtExaminerViewer(parent);

      myViewer->setSceneGraph(commonroot);
      myViewer->setTitle("Examiner Viewer");
      myViewer->show();

      // Map window and start event loop.
      //SoQt::show(parent);
      SoQt::show(myWindow);
      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. Bir daha ki yazıda görüşmek üzere!

ozkan@csharpnedir.com
(*) www.nr.com
Makale:
3D Grafik Programlama 3 : SoFaceSet Sınıfları,Vertexler C++ ve C++.NET dili Özkan Eren
  • Yazılan Yorumlar
  • Yorum Yaz
OCA
12
2017
c++ hangi sürümünü kullanıyorsunuz bende hata veriyor
OCA
19
2011
bu 3d modellemeyi kimler nasıl ne amaçla kullanır?
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor