※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ドップラー効果(Doppler Effect)

OpenAL 解説 最終更新日 2009-09-26
link_pdfプラグインはご利用いただけなくなりました。
View -


説明

ドップラー効果(Doppler Effect)とは「波の発生源と観測者の相対的な速度によって波の周波数が異なって観測される現象」のこと、発生源が近付く場合には波の振動が詰められて周波数が高くなり、遠ざかる場合は振動が伸ばされて周波数は低くなる。

(wikiediaより、赤点で表される音源が左方向に移動している。)


音波の例でいうと、救急車が近付くときにはサイレンの音が高く、遠ざかる時には低く聞こえるのはこのドップラー効果による現象。

音源(Source)と観測者(Listener)が同一直線上を移動する場合。(ただし、音源→観測者方向が正とする)
音速 V
音源が出す周波数 f_{Source}
音源の速度 V_{Source}
観測者の速度 V_{Listener}
観測者に届く周波数 f_{Listener}

f_{Listener} = f_{Source}*\frac{V-V_{Listener}}{V-V_{Source}}


ソースコード

ソースコードの全文と実行結果はこちらをどうぞ
ドップラー効果(Doppler Effect)-CPP

必須環境

OpenAL ALUT

要点

ドップラー効果をOpenALで実装するには以下の二つの関数を用いてドップラー効果の設定を行う。
alDopplerFactor(ALfloat DOPPLER_FACTOR)
alDopplerVelocity(ALfloat DOPPLER_VELOCITY)

この設定を用いて、新しい観測周波数は
shift = DOPPLER_FACTOR * frequency * (DOPPLER_VELOCITY - listener.velocity) / (DOPPLER_VELOCITY + source.velocity)
みたいな感じに計算されるらしい。


なので、ソースコードは以下のようになるっぽい。。。

単純にPosition += Velocityとすると移動が早すぎてまったく聞こえないので適当に補正値を掛けてみたり
//Position += revise*Velocity
const float revise = 0.000003;

音源と観測者が離れすぎると音が聞こえなくなるので、最大距離を決めとく。
ALfloat SourceMaxDist = 80.0;//これ以上離れると初期位置に戻る

ドップラー効果に関する設定
#define DOPPLER_FACTOR 0.5f
#define DOPPLER_VELOCITY 10.0f

音源の再生を開始し、音源の初期位置を記憶、ドップラー効果の設定を行う。
// 再生開始
alSourcePlay(Source);

//初期値を保存
ALfloat SourceDefPos[] = { SourcePos[0], SourcePos[1], SourcePos[2] };

//ドップラー効果の設定
alDopplerFactor(DOPPLER_FACTOR);
alDopplerVelocity(DOPPLER_VELOCITY);

移動開始、ドップラー効果に関係があるのは「*」の行。(他はループ再生用)
while(!kbhit()){//キーボード入力があるまでループ
far=AL_FALSE;

for(i=0;i<3;i++){
	//座標を更新
	SourcePos[i] += revise*SourceVel[i];//*
	//音源と観測者の距離が遠い?
	if( sqrt(abs(pow(SourcePos[i],2)+pow(ListenerPos[i],2)) ) > SourceMaxDist) far = AL_TRUE;
}
//遠かったらはじめの位置に戻る
if(far) for(i=0;i<3;i++) SourcePos[i]=SourceDefPos[i];

alSourcefv(Source, AL_POSITION, SourcePos);//*
}

参考文献