Arama Motoru

OpenAL Ders 7: Doppler Etkisi


14/06/2003
16/05/2010

Gerçek Dünya Fiziğine Bir Bakış
Lise fiziği dersinin tekrar karşısına çıkması bazıları için sıkıcı olacağını biliyorum , ama eğlenmeye bakın. Doppler etkisi, bazı insanlar için ince bir konsept olabilir, Ama o lojikal bir süreçtir, pozitif olarak bakılırsa bir ilginçlik çeşididir. Doppler etkisini anlamak için ilkin bir "Ses"'in gerçekte ne olduğunu anlamalıyız. Basit olarak ses havada yol alan bir basınç dalgasının aklınızda yorumlanmasıdır. Hava hareketlendiğinde etraftaki hava taneciklerini basınçlayan bir dalga başlar. Bu dalga, onun kaynak noktasından dışarı doğru yol alır. Takip eden diyagramı göz önüne al.
Bu diagramda (solda) büyük kırmızı "S" source’ün pozisyonu temsil eder, ve büyük kırmız "L" (tahmin edebileceğiniz üzere),  Listener'’ın pozisyonu temsil eder. Source ve listener hareket etmiyor. Source, dışarı doğru basınç dalgalarını yayar, diyagramda bu Mavi daireler ile temsil edilir. Listener,  bu diyagramda görüleceği üzere sesi geçirgen. Doppler etkisi, hiçbir hareket olmadığından dolayı bu örnekte aslında mevcut değildir; Doppler etkisi hareket dolayısıyla sesin eğrilmesini tasvir etmektedir.
Yapmaya giriştiğiniz şu diagramın gösterdiği resimdir. Source, bir dalga (daireler) yaydığı zaman, source pozisyonu olan kaynak noktadan başlayarak sürekli yayılıyor gibi görünür. Benzer bir etkinin güzel bir örneği sudaki yayınsal harekettir. Durgun bir suya bir çakıl taşını attığın zaman genişleyen şekilde etki noktasından uzaklaşan dalgalar yayılacak
. İster inan ister inanma bu tamamen aynı fizik olayından meydana gelir. Tabi Bu Doppler etkisiyle yapılmak zorunda olunan nedir? Sonraki diyagrama bakalım (sağda).
vay, burada ne oluyor? Source şimdi hareket halindedir, küçük kırmızı ok ile gösteriliyor. Source şimdi belli bir hızda listener’a(dinleyiciye) doğru hareket ediyor. Dalgaların (Daireler), birbirleri yerine geçtiğini bilhassa fark et. Yerini alma, onları yayan aynı kaynak yolunu izler. Bu, Doppler etkisinde anahtardır. Aslında olan, source'nin izlediği yolda farklı noktalarda dalga yaymasıdır. Onun yaydığı dalgalar onla hareket etmez,ama yayıldıkları noktadan onun izlediği yoldan devam eder.
listener tarafından algılanan sesi bu nasıl etkiler peki? Ee, son diagramdan da farkına varılabilecek source ve listener arası dalgalar (daireler) daha dar. Bu, ses dalgalarının böyle yakın olması algılanan ses daha hızlı gibi gelecek. Burada bahsettiğimiz şey frekanstır. Dalga mesafe aralığı sesin frekansını etkiler. Sesin yayıldığı kaynak hareket halinde olduğu zaman, bu frekansta bir değişikliğe sebebiyet verir. Alanın farklı noktalarında dalga mesafe aralarının değiştiğini fark etmişinizdir. Örneğin, hareketli source’de (Önceki hareketin herhangi yerine göre) mesafesi aslında daha geniştir, Bundan dolayı frekans daha düşük olacak (Mesafe ve frekans ters bir ilişkiye sahiptir). listener tarafından algılanan frekanstan kastedilen, Listener'ın durduğu yerle ilgilidir.
Listener'ın hareketi de frekansı etkileyebilir. Bunu resmetme gerçi biraz daha zordur. Eğer source hareketsiz Ve listener source'e doğru hareket ederse, o zaman listener tarafından algılanan frekans hareketli source için tanımladığımızla aynen eğriltilecek.
Eğer sen hala bunu kafanda canlandıramıyorsan, takip eden iki diyagramı dikkate al:
  
Bu iki diyagram, sesi, bir sinüsel dalga formunda gösteriyor. Birinciyi ele alalım. Dalgaları tepe olarak düşün. Dalganın (Tepe) zirvesi önceki diyagramlar setindeki mavi dairelerdir. Vadiler mavi daireler arasındaki boşluklardır. İkinci diyagramda sık bir dalgalanma gösterilmiştir. İkisini kıyasladığın zaman açıkça fark edeceksin. Basitçe İkinci diyagram aynı alanda daha çok dalgalanma hadisesine sahip. Başka bir ifadeyle daha büyük sıklıkla, daha büyük bayağılık veya daha büyük bir frekansla meydana gelir.
Bazı ekstra bilgilere ilgi duyabilecekler için: Dalgaların hızı, ses hızıdır. Eğer source hızı dalgaya kıyasla daha büyükse, O zaman source ses duvarını kırar.
OpenAL Fiziği
Tamam, yukarıda Doppler etkisini karışık yazımdan anladın, veya hali hazırda Doppler etkisini biliyor ve sadece onun OpenAL renderleme hattını nasıl etkileyeceğini bilmek istediğine onu atlamış da olabilirsin. En iyi başlangıcın direkt OpenAL spesifikasyonundan bunun aktarılması ile olacağı düşünüyorum:
" Doppler etkisi, ortamda göreli olarak source ve listener'ın hızlarına Ve bu ortamda ses yayılma hızına bağlıdır." - bölüm 3, altbölüm 7"
listener tarafından duyulan sesin son frekansını etkileyen 3 faktör olduğunun kastedildiğini bundan çıkarabiliriz. Bu faktörler source’nin sürati, listener'ın sürati, Ve önceden tanımlanan bir ses hızı.
"Ortam" olarak adlı şeyden source ve Listener’ın "bulunduğu" yeri anlamalıyız. Örneğin, Açık havada duyulan seslere kıyasla Su altında duyulan ses çok farklıdır. Hava ve su farklı ortam örnekleridir. Bu ortamlar arasındaki farklılık ses tanecik yoğunluğuyla ilgili. Daha önce dediğimiz gibi, Ses,  havada hareketli taneciklerden başka bir şey değildir. Çok daha büyük bir tanecik yoğunluğuyla bir ortamda ses, çok farklı olacak çünkü Tanecikler daha yakın temastadır. Onların, daha yakın temasında,  dalganın çok daha iyi yol almasına imkan verir. Tersi bir örnek olarak, açık alanı düşün. Açık alanda aşırı derecede zayıf bir tanecik yoğunluğu vardır. Aslında,  etrafta dağılmış sadece birkaç çok hafif tanecik(Çoğunlukla hidrojen) vardır. Bu, hiçbir sesin boşluktan duyulamamasının nedenidir.
Tamam, konumuza dönelim. OpenAL, içten bizim için Doppler etkisini hesaplar, velhasıl biz hesaplamayı etkileyecek sadece birkaç parametre tanımlarız. Gerçekçi renderlemeyi istemediğimiz durumda bunu yaparız. Eğer etkinin oldukça arttırılması veya azaltılması istenirse. Hesaplama şöyle:
    shift = DOPPLER_FACTOR * freq * (DOPPLER_VELOCITY - l.velocity) / (DOPPLER_VELOCITY + s.velocity)
Sabitleri ayırmak için tümü büyük harfte yazılı. "l" ve "s" değişkenleri sırayla listener ve source'dur. freq, dalga yayımının ilk değiştirilmemiş frekansı olup "shift" dalganın değiştirilm frekansıdır. "shift" terimi değiştirilmiş frekansa hitap için uygundur. Bu son kayılan frekans etkilediği bütün ses streamlemeleri için OpenAL tarafından örneklenecek.
'alListenerfv' ve 'alSourcefv'  'de 'AL_VELOCITY' kullanarak source ve listener ikilisinin hızını tanımlayabileceğimizi hali hazırda biliyoruz. Dosyadan yüklendiği zaman 'freq' parametresi direkt buffer özelliklerinden gelir. Sabit değerleri set etmede bize sunulan fonksiyonlar şöyle.

ALvoid alDopplerFactor(ALfloat factor);
ALvoid alDopplerVelocity(ALfloat velocity);

'alDopplerFactor' için herhangi negatif olmayan bir değer uygun. Negatif bir değeri geçmek, 'AL_INVALID_VALUE' hatasına sebep olup tüm komut görmezlikten gelinecek. Sıfırı geçmek tamamen geçerli bir argümandır. Bunu yapmak Doppler etkisini iptal eder, aslında toplam performansa faydalı olabilir (Ama o kadar gerçekçi olmayacak). Doppler faktörünün etkisi direkt denklemin büyüklüğünü değiştirecek. 1.0 değeri herhangi bir şekilde etkiyi değiştirmeyecek. 0.0 Ve 1.0 arası herhangi değer geçilmesi Doppler etkisini en aza indirip 1.0'den daha büyük herhangi bir sayı etkiyi azami dereceye çıkaracak.
'alDopplerVelocity'  için negatif olmayan sıfırdan farklı herhangi bir değer uygundur. Negatif ya da sıfır değerini geçmek, 'AL_INVALID_VALUE'' hatasına sebep olup tüm komut görmezlikten gelinecek. Doppler hızı aslında ses hızıdır. Bunu ayarlama ortam boyunca çalınacak sesin hızını ayarlama gibi olur. OpenAL, hiçbir ortam anlayışına sahip değil, Ama hızı ayarlamak bir ortam etkisini verecek. OpenAL aynı şekilde hiçbir birim anlayışına sahip değildir (kilometre, mil, parsek), Bundan dolayı şunu aklından çıkarma bu değeri set ettiğinizde bir şekilde tanımladığınız birimlerin bütün diğer nosyonlarıyla uyumludur.


Bu dersin Java versiyonu için Java Bindings for OpenAL sayfasına bakın (Athomas Goldberg tarından adapte edilmiştir)


Dersin Orjinali : http://www.devmaster.net/articles/openal-tutorials/lesson7.php