Minggu, 09 Mei 2010

dtTerrain Part 3 - Load Your Terrain

The dtTerrain Tutorial, Bagian 3 - me-Load Terrain anda

Di bagian 1 kita telah membahas arsitektur dan teknologi di belakang dtTerrain dan dalam bagian 2 proses yang terlibat dalam menulis pembaca dtTerrain, penyaji dan dekorator. Untuk bagian ini kita akan berkonsentrasi pada menulis dan menjalankan aplikasi dtTerrain.

1. Memeriksa Aplikasi testTerrain

Kami memulai dengan menambahkan file header yang tepat untuk sumber kami.


#include
#include

#include

#include


Anda akan melihat bahwa saya telah menambahkan pembaca, penyaji dan dekorator. Ini diperlukan untuk membuat aplikasi dtTerrain berfungsi.

Dalam aplikasi Anda, Anda akan perlu menciptakan obyek Terrain dan lulus dalam jalur cache. Jalan cache akan berisi semua data diproses ubin medan untuk mengoptimalkan berjalan konsekuen atas ubin individu. Ini adalah cara tampilannya di testTerrain....


//Create our terrain and add a reader and renderer to it.
mTerrain = new dtTerrain::Terrain();
mTerrain->SetCachePath(mCachePath);


Kita harus membuat sebuah instance dari pembaca daerah kami. Dalam hal ini kita menggunakan pembaca DTED kami diperiksa sebelumnya.


//Create the terrain reader...
dtTerrain::DTEDTerrainReader *reader = new dtTerrain::DTEDTerrainReader();


Kita harus membuat sebuah instance dari penyaji daerah kami. Dalam hal ini kita akan menggunakan renderer SOARX daerah kami diperiksa sebelumnya.

//Create the terrain renderer...
dtTerrain::SoarXTerrainRenderer *renderer = new dtTerrain::SoarXTerrainRenderer();


Sekarang tambahkan pembaca dan penyaji ke objek daerah.

//Connect our reader and renderer to the terrain.
mTerrain->SetDataReader(reader);
mTerrain->SetDataRenderer(renderer);


Sejauh ini kita telah membuat objek daerah kami dan ditambahkan pembaca dan penyaji. Sekarang kita perlu membuat dan menambahkan lapisan dekorasi kami. Lapisan dekorasi berikut diperpanjang dari kelas dasar TerrainDecorationLayer abstrak. Pada dasarnya dekorator vegetasi akan menghitung posisi dan mentransformasi obyek dan kemudian menambahkannya ke grup osg node dikembalikan ke daerah kami

// Add a decoration layer
mVeg = new dtTerrain::VegetationDecorator;


Karena kita termasuk dekorator vegetasi mari kita cepat mendefinisikan beberapa properti yang membuatnya berfungsi dengan benar.

mLCCType = CreateLCCType();
mVeg = new dtTerrain::VegetationDecorator;


// Configure the vegetation
mVeg->SetRandomSeed(27);
mVeg->SetVegetationDistance(14000.0f);
mVeg->SetLoadDistance(15000.0f);
mVeg->SetMaxObjectsPerCell(5000);


Ah Anda mungkin bertanya ... apa sebenarnya adalah LCCType dan bagaimana aku pergi tentang menciptakan satu? Nah itu pertanyaan yang sangat bagus. vegetasi menggunakan data tanah klasifikasi untuk menentukan jenis pohon, semak-semak, dll kita perlu ditambahkan ke medan. Karena kita ingin menambahkan kemampuan untuk model yang berbeda dan jenis klasifikasi untuk vegetasi kami, kami memiliki metode LCCType.

Jadi benar-benar cepat membuat vektor LCCTypes dan kemudian menambahkannya ke lapisan vegetasi.

std::vector LCCType;

dtTerrain::LCCType water(11,"water");
water.SetRGB(110,130,177);

dtTerrain::LCCType lowResidential(21,"low residential");
lowResidential.SetRGB(253,229,228);
lowResidential.SetSlope(0,20,1);
lowResidential.SetElevation(5,2000,1);
lowResidential.SetRelativeElevation(0,80,1);
lowResidential.SetAspect(255);
lowResidential.AddModel("models/house0.ive");
lowResidential.AddModel("models/house1.ive");

dtTerrain::LCCType highResidential(22,"high residential");
highResidential.SetRGB(247,178,159);
highResidential.SetSlope(0,20,1);
highResidential.SetElevation(5,2000,1);
highResidential.SetRelativeElevation(0,80,1);
highResidential.AddModel("models/house2.ive");

dtTerrain::LCCType industrial(23,"industrial");
industrial.SetRGB(157,186,0);
industrial.SetSlope(0,20,1);
industrial.SetElevation(5,2000,1);
industrial.SetRelativeElevation(0,80,1);
industrial.SetAspect(225);
industrial.AddModel("models/industry0.ive");
industrial.AddModel("models/industry1.ive");
industrial.AddModel("models/industry2.ive");

Wow Anda menciptakan vektor Anda LCCTypes, sekarang pergi ke depan dan menambahkannya ke dekorator vegetasi....


// Add the LCCTypes
mVeg->SetLCCTypes(mLCCType);

Setelah Anda menambahkan berbagai properti yang berhubungan dengan dekorator Anda, Anda perlu menambahkannya ke objek daerah. Ini dapat dicapai hanya dengan kode berikut.

// Add the vegetation decoration layer to our terrain
mTerrain->AddDecorationLayer(mVeg);


Sekarang kiri satunya hal adalah menambahkan sumber daya terrain untuk medan. Path sumberdaya terrain adalah lokasi data dataran Anda. Ambil dicatat bahwa medannya mendukung tidak terbatas jumlah path sumberdaya.

// Load the terrain resource
mTerrain->LoadResource(mResourcePath);


Tergantung pada aplikasi apa delta3d Anda terlihat seperti Anda harus menambahkan objek daerah baik kamera atau benda lingkungan.

// Add the terrain to our environment
mEnv->AddChild(mTerrain.get());


Potongan kode diatas adalah alat dasar yang Anda butuhkan untuk menciptakan dtTerrain dalam aplikasi Delta3D.
2. The Terrain dalam Aksi

Menampilkan gambar berikut DTED data yang diberikan oleh SOARX Renderer. Perhatikan bahwa latar belakang adalah tidak skybox sebuah; medan jauh yang menyatu dengan cakrawala adalah fakta data medan nyata. Amazing bahwa Anda dapat melihat sejauh ke kejauhan bukan? Check it out sendiri, mengisi data DTED Anda dan mulai berjalan!

Gambar berikutnya menunjukkan apa yang terjadi ketika kita zoom in pada bagian yang tampaknya tidak menarik dari medan. Sepertinya tessellation adalah sangat rendah ... bukan? Yah lihat gambar selanjutnya!








Wow! Lihatlah apa yang terjadi ketika kita muncul tessellation tersebut. Hal ini tidak hanya menciptakan lebih halus kontur bentang alam kita, tetapi juga meningkatkan tingkat detail. Ini adalah penyaji SOARX di itu terbaik. Kemampuan untuk secara dinamis mengubah tessellation medan adalah salah satu alasan SOARX begitu kuat.

Tidak ada komentar:

Posting Komentar