Jumat, 14 Mei 2010

Sound in a Delta3D Application


Delta3D memanfaatkan library OpenAL untuk menyediakan audio untuk simulasi dan permainan. kemampuan audio nya adalah meng-enkapsulasi dalam dtAudio module. Tutorial ini akan memberikan beberapa contoh cara menggunakan dtAudio module untuk menambahkan suara ke aplikasi Anda.


Contoh 1

Ini contoh yang sangat dasar menunjukkan cara bermain suara pada startup aplikasi. Untuk contoh serupa yang mempekerjakan beberapa hal-hal seperti menanggapi penekanan tombol, lihat "testSound" contoh aplikasi yang disediakan dengan sourcecode Delta3D.
Pertama, membuat aplikasi Delta3D (tersebut tercakup dalam tutorial lainnya). Untuk tutorial ini saya membuat sebuah aplikasi bernama SoundDemoApp. Berikut adalah metode konfigurasi dari aplikasi tersebut. Metode Config akan dipecat pada saat startup aplikasi untuk Aplikasi Delta3D:

//To build this code you will need to have #included dtAudio/audiomanager.h somewhere in your code
//and you need to link against the dtAudio library.
void SoundDemoApp::Config()
{
   dtAudio::AudioManager::Instantiate();          //Create the AudioManager (which is a Singleton)

   //We need to call dtAudio::AudioManager::GetInstance().Destroy()
   //when we're all done with audio in the application.  If audio is going to be used throughout
   //the application the best place to do this is probably the Application's destructor.

   //Ask the AudioManager for a new sound
   dtAudio::Sound* drumRoll = dtAudio::AudioManager::GetInstance().NewSound();
   //Load and play our snazzy new sound
   drumRoll->LoadFile("drum_roll.wav");
   drumRoll->Play();   //This call can be a bit deceiving -- we are actually sending a message
                       //to the AudioManager to play the sound as soon as CPU time becomes available.

   //Once we're all done with our Sound, we should return it to the AudioManager for recycling via
   //dtAudio::AudioManager::GetInstance().FreeSound();
   //DON'T do this immediately after the Play() call! The "play message" almost certainly hasn't got through
   //"the system" yet, so we won't hear anything if we free the sound the line after we tell it to play.
}

Di sini kita diperkenalkan pada AudioManager Delta3D. Ini adalah kelas tunggal yang bertanggung jawab untuk mengelola seluruh suara dalam aplikasi. Antrean AudioManager sampai perintah untuk diproses pada saat yang tepat. Ini berarti bahwa ketika kita sebut metode Play Sound, adalah mungkin untuk callback yang akan ditetapkan ketika suara dimulai dan ketika berhenti (lihat dokumentasi SetStopCallback SetPlayCallback dan metode dari kelas Sound of Delta3D). Suara juga dapat memutar ulang atau berhenti.


Contoh 2

OpenAL memungkinkan kita untuk mengatur posisi untuk Sound apapun dan juga untuk global "pendengaran" (atau mikrofon). apliklasi Delta3D dapat memiliki banyak suara tetapi hanya satu Pendengar. Mendapatkan suara keras saat mereka lebih dekat dengan Pendengar dan lembut saat mereka lebih jauh dari itu. Kedua suara dan Pendengar dapat dilampirkan ke Delta3D graphical Objects dan perhitungan redaman akan dilakukan secara otomatis sebagai Objek bergerak. Berikut ini adalah segmen kode untuk sebuah Aplikasi TestSoundApp  yang metode Configurasinya memasang Pendengar untuk Kamera Scene dan Suara ke helikopter 3D Obyek:

void TestSoundApp::Config()
{
   //Position our camera --------------------------------
   dtCore::Transform camPos;
   camPos.Set(0.0f, 10.0f, 0.0f,    //Position
              0.0f, 0.0f, 0.0f,     //LookAt
              0.0f, 0.0f, 1.0f);    //Up Vector

   GetCamera()->SetTransform(camPos);
   GetCamera()->SetPerspectiveParams(45.0, 1.0, 0.1, 500.0);
   //Done positioning camera -----------------------------

   //Setup a MotionModel and attach it to the camera so we can walk around.
   dtCore::WalkMotionModel* mWalkMM = new dtCore::WalkMotionModel(this->GetKeyboard(), this->GetMouse());
   mWalkMM->SetScene(GetScene());
   mWalkMM->SetTarget(GetCamera());

   //Setup some terrain so we have something to walk around on.
   dtCore::RefPtr<dtCore::InfiniteTerrain> mInfTerrain = new dtCore::InfiniteTerrain();
   mInfTerrain->SetVerticalScale(0.01f);
   AddDrawable(mInfTerrain.get());

   //Setup the Audio Manager
   dtAudio::AudioManager::Instantiate();

   //Load up our helicopter hum sound
   dtAudio::Sound* helicopterHum;
   helicopterHum = dtAudio::AudioManager::GetInstance().NewSound();

   helicopterHum->LoadFile("helo.wav");
   //have the helicopter humming sound play over and over so it never stops
   helicopterHum->SetLooping(true);
   //helicopters are pretty loud -- they get quiet slowly as they move away:
   helicopterHum->SetRolloffFactor(0.15f);
   helicopterHum->Play();
   //Done loading up helicopter sound

   //Load up our helicopter 3d model so we have a visual point of reference to tell
   //how far away from or (how close to) we are relative to the sound.
   mHelicopterObj = new dtCore::Object("helicopter");
   mHelicopterObj->LoadFile("uh-1n.ive");

   //Attached the helicopter sound to the helicopter 3D graphical model.  This will
   //cause the Sound to move with the 3D model.
   mHelicopterObj->AddChild(helicopterHum);

   AddDrawable(mHelicopterObj.get());
   //Done loading up helicopter graphical model ------------------------------

   //Get the Listener from the Audio Manager and attach it to the Camera:
   dtAudio::Listener* globalEar = dtAudio::AudioManager::GetInstance().GetListener();
   GetCamera()->AddChild(globalEar);
}

Kita sekarang bisa memindahkan Kamera dekat atau jauh dari helikopter di dunia 3D dan mendengar bagaimana suara dipengaruhi.
Perhatikan penggunaan metode SetRolloffFactor pada objek Sound helicopterHum. Nilai agak kecil seperti 0,15 menyebabkan suara untuk tinggal lebih keras lagi karena kami bergerak jauh dari itu. Jika kita ingin memiliki suara mendapatkan diam lebih cepat saat kami pindah, maka kita akan engkol roll off factor yang lebih tinggi.
Selain suara dan setup 3D Obyek, sebuah WalkMotionModel digunakan untuk memungkinkan kita untuk memindahkan kamera sekitar (yang, ingat, terlampir pada Pendengar global). Beberapa Terrain juga termasuk memberi kami sesuatu untuk berjalan di atas.
OK, jadi kita dapat memindahkan Pendengar tentang. Bagaimana pindah Sound itu? Salah satu cara yang bisa kami lakukan itu adalah untuk menghidupkan helikopter 3D Objek untuk bergerak maju mundur sehingga kita dapat mendengar perubahan suara ketika bergerak dalam kaitannya dengan Kamera:

void TestSoundApp::PreFrame(const double deltaSimTime)
{
   static double moveStep = 0.1;

   //oscillate!!
   if (mTranslation[0] > 40.0 || mTranslation[0] < -40.0)
      moveStep *= -1.0;

   dtCore::Transform xForm;
   mHelicopterObj->GetTransform(xForm);
   xForm.GetTranslation(mTranslation);
   mTranslation[0] += moveStep;
   xForm.SetTranslation(mTranslation);
   mHelicopterObj->SetTransform(xForm);
}

Mendefinisikan sebuah metode PreFrame dalam dtABC Delta3D:: Aplikasi akan menyebabkan kode di sana untuk mendapatkan yang disebut sebelum setiap renders frame. kode ini memindahkan helikopter Obyek 3D bolak-balik sepanjang sumbu x. Sejak Suara helikopter itu membuat anak Objek 3D dalam metode Config, Sound secara otomatis berubah posisi yang tepat bersama dengan Objek 3D.
Roll off tidak efek-satunya yang dapat diatur pada suara. Hal-hal lain yang dapat diatur adalah keuntungan, pitch, arah dan kecepatan. efek doppler menarik seperti juga mungkin dengan bermain-main dengan parameter. Lihat dokumentasi dtAudio:: Sound untuk informasi lebih lanjut. Untuk lebih komprehensif (tapi lebih kompleks) contoh, lihat "testAudio" misalnya dalam distribusi Delta3D.

Kompatibilitas Catatan

Delta3D hanya mendukung format audio yang didukung oleh OpenAL. OpenAL menyediakan dukungan untuk format audio terkompresi. Kompresi tidak didukung dengan cara apapun melalui OpenAL dan diserahkan kepada pengembang untuk dekompresi dan audio streaming ke OpenAL jika mereka ingin menggunakan format kompresi seperti mp3 atau Ogg Vorbis. Jika Anda ingin menggunakan format yang dikompresi kemudian melihat perangkat seperti ffmpeg dan libavcodec untuk dekompresi dan data stream audio ke OpenAL. Saat ini, Namun, format ini biasanya digunakan oleh dan direkomendasikan untuk Delta3D adalah WAV.
Setelah mengatakan ini, harus menyadari bahwa tidak semua. File wav diciptakan sama! Panjang cerita pendek: jika Anda. file wav tidak akan bermain melalui dtAudio (atau OpenAL), kemudian memastikan bahwa Anda memiliki file wav yang menggunakan PCM dan tidak menggunakan kompresi.. Salah satu cara untuk melakukannya adalah dengan beban setiap menyinggung file wav ke dalam Audacity alat dan Open Source. Ekspor sebagai WAV. Aku tahu, itu adalah _already_ file wav., Tapi ingat, tidak semua. File wav sama.
Meskipun. File wav audio biasanya berisi terkompresi dalam format PCM, WAV spesifikasi juga mendukung pengkodean lainnya, termasuk kompresi (yang OpenAL tidak mendukung). Hal ini akan membingungkan sangat cepat, sebuah diskusi lengkap codec audio adalah cara di luar lingkup dokumen ini. Jika Anda benar-benar ingin masuk ke sepele audio digital, tempat yang baik untuk memulai adalah entri Wikipedia pada file WAV.
Perlu diketahui juga bahwa Delta3D tidak mendukung posisi suara stereo (hanya mono).


sumber : http://sourceforge.net/apps/mediawiki/delta3d/index.php?title=Sound_in_a_Delta3D_Application

1 komentar:

arman on 7 Juni 2010 pukul 15.06 mengatakan...

thanx y si hehehe

 

qazdec27