ヘッドフォン・イヤホン使用時の自然な3Dサウンド

概要

CRI Atom Craft 側で「3Dサウンド」に設定するパターン 」の場合、パンが左右に振られるだけであり、両耳間時間差や音の回折等は考慮されていません。
これは「ゲームプレイヤーがスピーカーで音を聴く」ということを前提としているからです。
そのためゲームプレイヤーがヘッドフォンやイヤホンで音を聴く場合は、少し不自然な聴こえ方になってしまいます。
(例えばゲームプレイヤーから見て真左にある音源の音は、左耳には届きますが右耳には全く届かない結果となります。これは現実世界ではありえない現象です。)
そこで、ヘッドフォン・イヤホン使用時の自然な3Dサウンドを実装する方法をご紹介します。
「ヘッドフォンバーチャルサラウンド」というエフェクトを使用することで実現可能です。

「ヘッドフォンバーチャルサラウンド」とは?

  • エフェクトの一種です
  • 左右の耳それぞれの音圧差が考慮されます
  • 音が左右の耳にそれぞれ到達するまでの時間差が考慮されます
  • 音が頭部を回折して(回り込んで)聴こえて来る現象が考慮されます
  • 耳たぶによる音の変化は考慮されません
  • ゲームプレイヤーは水平方向(左,前方,右,後方等)どの方向から音が鳴っているのか知覚できます
  • ゲームプレイヤーが垂直方向(上方,下方等)どの方向から音が鳴っているのか知覚することはできません
注意
自然な3Dサウンドを実装する手段として紹介していますが、実際はサラウンド音声(5.1ch、7.1ch)をヘッドフォン環境で疑似的に再現するためのエフェクトであり、現実世界の音の聴こえ方を厳密に再現する物ではありません。

ワークフロー

CRI Atom Craft を開いてください。
(1) DSPバス設定の画面を開きます
(2) 新しいバス「Real3D」を作ります
(3) エフェクトとしてヘッドフォンバーチャルサラウンドを追加します
(4) センド先をMasterOutに設定します
criware_ue4_headphone_virtual_surround_dspbus_setting.jpg
(5) キュー設定用バスマップの画面を開きます
(6) バスセンド一覧に「Real3D」を追加します
criware_ue4_headphone_virtual_surround_bus_map.jpg
(7) キューを作ります
(8) 波形を選択し、3Dポジショニングに設定します
(9) バスセンドの画面を開き、バスマップの「Real3D」にチェックを入れます
  MasterOutにはチェックを入れないようにしてください
criware_ue4_headphone_virtual_surround_bus_send.jpg
このキューを鳴らせば自然な3Dサウンドに聴こえます。

課題

上述のキューをヘッドフォンやイヤホンで聴くと自然な3Dサウンドに聴こえますが、スピーカーで聴くと違和感を感じるかもしれません。
なぜなら、下記現象が発生するからです。
(1) HRTFが掛かった音がスピーカーから出力される
(2) その音に対してさらにゲームプレイヤー自身の頭部・耳によるHRTFが掛かる
(3) 音が鼓膜に到達する
そこで、ゲームプレイヤーの視聴環境に応じてHRTFのON/OFFを切り替えると良いでしょう。
  • ヘッドフォン・イヤホン ... HRTFを掛けた方が自然に聴こえる
  • スピーカー ... HRTFを掛けない方が自然に聴こえる
「Set Effect Bypass」ノード/関数を使用することでHRTFのON/OFFを変更することができます。
criware_ue4_headphone_virtual_surround_bypasses.jpg
今回は「Bus Name」に「Real3D」を指定していますが、もしAtomCraft側で別の名前を設定している場合はそれと同じ文字列を指定してください。
「Effect Name」には必ず「CRIWARE/HeadphoneVirtualSurround」を指定してください。
「Bypasses」にチェックを入れることでHRTFが掛からなくなります。
この場合、通常の3Dポジショニングと同じ聴こえ方になります。
逆にHRTFを掛けたい場合は「Bypasses」のチェックを外した状態でこのノードを実行します。

Q&A

Q. 既に再生中の音声も「Set Effect Bypass」の影響を受けますか?

A. はい、影響を受けます

Q. ゲームプレイヤーがスピーカーで音を聴いているかどうかを検出するにはどうするのですか?

A. CRI側ではそういった機能はご提供しておりません。
 オープンソースのライブラリもしくはコンシューマーゲーム機のライブラリがAPIを提供していないかどうかご確認ください。
 もしくは、ゲームのコンフィグ画面でゲームプレイヤー自身に設定してもらうアプローチもご検討ください。