2014年09月03日

Oculus SDK 0.4.1とOpenAL Soft 1.15についてのメモ

CEDEC2014で、3Dサウンドは効果的ですよみたいな話があったみたいなので、Oculus SDK+Glut+OpenAL Softのメモです。OpenAL Soft[1]が1.16になってますね。

1. 音声データの準備
[2]では、モノラルの16ビットの44100Hzにしていますので、効果音などのデータを一度その形式に変換することにします。変換はffmpegを使うことにしました。コマンドは[3]を参考にさせていただきました。

Windowsのバッチファイルでドラッグ&ドロップして同名のwavファイルを作成する場合
ffmpeg -i %1 -ac 1 -ar 44100 -acodec pcm_s16le %~n1.wav

2. OpenAL Softの使用
[2]を見れば大体問題ないかと思います。省略。

3. Oculus SDK 0.4.1との組み合わせ
OpenALでは、音源をSource、ユーザの位置をListenerとして設定しますので、Oculus SDKで取得した位置姿勢をListenerの関数で設定してあげればよい、ということになります。
  for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++)
{
ovrEyeType eye = hmd->EyeRenderOrder[eyeIndex];
eyeRenderPose[eye] = ovrHmd_GetEyePose(hmd, eye);

OVR::Matrix4f rollPitchYaw = OVR::Matrix4f(eyeRenderPose[eye].Orientation);
OVR::Vector3f finalUp = rollPitchYaw.Transform(OVR::Vector3f(0,1,0));
OVR::Vector3f finalForward = rollPitchYaw.Transform(OVR::Vector3f(0,0,-1));
OVR::Vector3f shiftedEyePos = HeadPos + eyeRenderPose[eye].Position;
OVR::Vector3f targetPos = shiftedEyePos + finalForward;
OVR::Matrix4f view = OVR::Matrix4f::LookAtRH(shiftedEyePos, targetPos, finalUp);
...
}
alListener3f( AL_POSITION, shiftedEyePos.x, shiftedEyePos.y, shiftedEyePos.z );
// 速度の計算は省略。(現在位置-前の位置)/微小時間
alListener3f( AL_VELOCITY, vel[0], vel[1], vel[2] );
// 前方向と上方向を指定すればよい。正規化は必要?
float orient[6] = { /*fwd:*/ finalForward.x, finalForward.y, finalForward.z,
/*up: */ finalUp.x, finalUp.y, finalUp.z };
alListenerfv( AL_ORIENTATION, orient );
...

前回の一枚絵の位置に足音の音源を設置して、見回したり絵の位置を動かすとちゃんと3次元的に位置が変わったので、多分問題ないと思います。

[1] http://kcat.strangesoft.net/openal.html
[2] http://cranialburnout.blogspot.jp/2012/08/openal-soft-demonstration-of-binaural.html
[3] http://www.xucker.jpn.org/pc/ffmpeg_wav.html
web拍手 by FC2
posted by シンドラー at 02:41 | Comment(0) | TrackBack(0) | Oculus Rift | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。