Game Development #22 ドップラー効果

昨日何気なくドップラー効果のWikipediaを見ていたら面白そうだったので取り組んでみました。ドップラー効果といえば救急車のサイレンでおなじみですよね。

Wikipediaの図を見てもらえればわかると思いますが、移動する音源が伝える周波は観測者の場所によって変わります。音源が観測者に近づくと高周波になり、遠のくと低周波になります。

また音源の発するエネルギーは球状で広がって薄まっていくことになります。球の表面積は4πR^2なので、距離の二乗で薄まっていきます。50m先の自動車の音の大きさは100m先の自動車の音の4倍ということになりますね。

Wikipediaに載っている公式を見てみます。
(観測者と音源の同一線上で、音源Sから観測者Oに向かう向きを正とする時の、音の振動数)

f’ = f * (V – Vo) / (V – Vs)

f:音の振動数、V:音速、Vo:観測者の速度、Vs:音源の速度

たとえば立ち止まっている人の近くを救急車が時速180kmで通り過ぎる時、秒速にすると50[m/s]になります。公式に当てはめると、音速は約340[m/s]なので
f’ = f * (340 – 0) / (340 – 50) = 1.17
つまり17%ぐらい高周波の音になります。反対に遠のく場合は-50[m/s]の速度になるので
f’ = f * (340 – 0) / (340 – (-50)) = 0.87
と、13%ぐらい低い周波数の音になります。

doppler_effect

ゲームプログラムでは観測者と音源の座標と移動ベクトルがあれば同じように計算することができます。座標から音源から観測者へのベクトルを求め、そのベクトルにそれぞれの移動ベクトルを投影すれば、お互いが向き合っている軸での移動量を計算することができます。

doppler_code

XNAでのコードはこんな感じにしました。短いですね。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中