CRIWARE UE4 Plugin v1.29.00.00 では、CRI ADX2 の空間音響接続機能「3Dトランシーバー」を使用するためのインタフェースが新たに追加されました。3Dトランシーバ機能を使用することで、窓やドアを通して屋内外から音が漏れ聞こえるような音響表現を擬似的に実現できます。
ここでは 3D トランシーバ機能の基本的な機能と注意点について説明します。すぐに Unreal Engine プロジェクト上で本機能を試したい場合は、後述の「AtomTransceiverBox ブループリントクラス」の使い方を参照してください。
3Dトランシーバ機能は3Dポジショニングの仮想空間上で音声をサブミックスし、一点から出力する機能です。
下図は3Dトランシーバ機能の概要を説明しています。開口部を伴う、壁に囲まれた空間を俯瞰で見下ろした図です。3Dトランシーバは、壁の内側 (屋内) の3D音源をグループ化し、 壁の外側 (屋外) の3Dリスナーに音声をサブミックスして伝える機能です。
3Dトランシーバーを用いない3Dポジショニングでは、仮に音源がゲーム上で部屋の中にあった場合でも、 音像の向きは壁を無視します。本機能を利用することで、閉じられた空間内に存在する音を開口部からまとめて出力することが可能になります。逆に、リスナーが閉じられた空間に侵入した場合には外の世界の音を入り口に集約して出力することができます。
「3Dリージョン」を与えることで、3D音源と3Dリスナーは自動的にグループ化されます。グループ化された3D音源は、同じ3Dリージョンに属している3Dトランシーバに紐付けられます。
下図のように「屋内」リージョンを付与された3Dソースの音声出力は、同じく「屋内」リージョンを付与された3Dトランシーバに集約されます。「屋外」リージョンを付与された屋外3Dリスナーは、屋内3Dトランシーバを経由して屋内3Dソースの音を聴くことができます。一方で、屋外3Dソースからの音はトランシーバを経由せずに直接聴くことができます。
1 つの3Dトランシーバに複数の3Dリージョンを付与することはできません。また、1つの3Dリージョンに複数の3Dトランシーバを結びつけることもできません。3Dトランシーバと3Dリージョンの対応関係は、必ず 1:1 でなければならないことに注意してください。この原則に反する設定を適用した場合、予期せぬ動作に繋がる恐れがあります。
もしマップ上の1つ建物に複数のドアが存在した場合、1つの「屋内」リージョンだけでは不足しています。ドア毎に異なるトランシーバとリージョンを用意する必要があります。つまり、この建物内をさらにいくつかのリージョンに分けて管理する必要があります。
3Dトランシーバは3つの Field 機能を備えています。
これらの Field 機能については下図を基本に考えることができます。
ここでは、リスナーが存在する3D空間上の位置を (A)、(B)、(C)、(D) の4種類で考えます。各位置において、リスナーが聴く3Dソースと3Dトランシーバからの音声出力が変化します。図中ではリージョンの表示を省略しています。屋内外をつなぐ開口部を3Dリスナーが跨いだとき、3Dリスナーのリージョンは自動的に切り替わるものとします。
Attenuation Distance Field は3Dトランシーバとリスナー間の距離に応じて出力音声の音量を変化させるための Field 機能です。3Dトランシーバを中心に、最大減衰距離と最小減衰距離を設定することができます。
上の Field 図においては、赤色の円内が最小減衰距離の範囲、青色の円内が最大減衰距離の範囲です。リスナー位置(A)~(D)に応じて、出力音声は以下のように変化します。
リスナーが位置(B)に存在する際、出力音声の音量には3Dソースと3Dトランシーバ間の距離も加味されます。下図のような減衰が適用される点に注意が必要です。
リスナーの3Dリージョンを切り替えた際、デフォルトの設定下では音像が急激に変化してしまいます。この変化はスピーカーデバイスから非連続な変化を伴う音声として出力されます。ゲームプレイヤーは不自然さを感じ、ゲームへの没入感を失わせる恐れがあります。このような問題を防ぐために、3Dトランシーバーは出力音声のクロスフェード機能を備えています。
上の Field 図中の青色の領域を「クロスフェード領域」、赤色の領域を「直接音領域」と呼びます。リスナー位置(A)~(D)に応じて、出力音声は以下のように変化します。
クロスフェード領域と直接音領域を設定することで、位置(B) –> (C) –> (D) への移動の際に音像を連続的に変化させることができます。
5.1ch等、マルチチャンネルのスピーカー環境下においては、幾つのスピーカーからどの程度の音量で出力されるかによってゲーム中の音像の変化を表現することが可能です。このような変化を実現するために、CRI ADX2 ではパンニングとインテリア距離の機能が提供されています。3Dトランシーバの Output Interior Pan Field も同様の概念に基づく機能です。
上の Field 図においては、赤色の円内がトランシーバ半径の範囲、青色の円内がインテリア距離の範囲です。リスナー位置(A)~(D)に応じて、出力音声は以下のように変化します。
3DトランシーバにはグローバルAISACと、それをコントロールするためのAISACコントロールを設定することが可能です。その際、AISACコントロールを下記の値にバインドすることが可能です。
上から、距離減衰AISAC、リスナー基準方位角AISAC、リスナー基準仰俯角AISAC、音源基準方位角AISAC、音源基準仰俯角AISAC に相当します。各種 AISAC の詳細は CRI ADX2 ツールマニュアルの、各機能についての解説を参照してください。
3Dトランシーバに AISAC を適用することで、リスナーとの位置関係に応じて出力音声にエフェクトを掛けたり、その強さを変化させたりといったことが可能です。例えば、屋内から漏れ聞こえる音にローパスフィルタを掛けることで、疑似的な音響遮蔽の表現が可能です。
CRIWARE Unreal Engine Plugin のユーザは 3D トランシーバ機能を使用するために、下記のインタフェースを使用することができます。
3Dトランシーバ機能のプリミティブなコントロールを希望する場合は、Atom3dTransceiverComponent クラスを使用することができます。このクラスは SceneComponent の派生クラスであり、C++ とブループリントの両方からアクセスすることができます。また、Unreal Editor 上で GUI 操作を行うことにより対象のアクターにアタッチすることも可能です。
下図はUnreal Editor 上で表示される Atom3dTransceiverComponent の詳細タブの内容です。これまでに述べた3Dトランシーバ機能の設定値を変更し、適用することが可能です。
コンソール変数 "cri.ShowSoundLocation" に "1" を指定することで、下図のように3Dトランシーバの情報を可視化することが可能です。
青色のスプライトが3Dトランシーバの位置を示しています。赤い矢印は3Dトランシーバの前方方向を、水色の矢印は頭上方向を指しています。また、黒い文字のテキストラベルによって、3Dトランシーバのリージョン情報と位置関係が示されます。リージョン名の隣の "(Inactive)" という文字列は、現在このトランシーバから音声が出力されているかどうかを示します。リスナーと同じリージョンに属している場合は "(Inactive)" を示し、音声は出力されません。
このデバッグ機能で可視化できるのは以下の情報です
上図では 3 つの Field の内、Output Interior Pan Field のみを可視化しました。Atom3dTransceiverComponent の各種 Field 設定プロパティの "Visible" チェックボックスで個別の表示切替えが可能です。また、Details カテゴリの "Visible" チェックボックスででテキストラベルの表示切替えも可能です。
本機能はPIE中にのみ使用可能である点に注意してください。
CRIWARE Unreal Engine Plugin において、3Dリージョンは単一のアセットクラスとして提供されます。ユーザは Atom3dRegion アセットを作成し、目的の3Dソースや3Dトランシーバ、3Dリスナーに対して所有させることが可能です。
CRIWARE Unreal Engine Plugin において、3Dソース、3Dトランシーバ、3Dリスナーは別個のクラスで表現されます。これら以外にもリージョンを所有することが可能なクラスが存在します。以下にまとめます。
クラス名 | 概要 | 所有する3Dリージョンの用途 |
---|---|---|
Atom3dTransceiverComponent | 3Dトランシーバ | (割愛) |
FAtomListener | 3Dリスナー | このリスナーと同じリージョンに属する3Dソースはトランシーバを介さず音声出力される |
AtomComponent | 3Dソース | この AtomComponent と同じリージョンを持つトランシーバへ音声出力を集約する |
SoundAtomCue | キュー | このキューアセットを再生する AtomComponent は、このキューと同じリージョンに所属する |
AtomParameterComponent | Atom関連パラメータを保持するコンポーネント | このコンポーネントを付与されたアクターがアニメーションする際、PlayAtomCue 通知によって動的に生成された3Dソースは、このコンポーネントと同じリージョンに所属する |
Unreal Editor のコンテンツブラウザ上で作成可能です。
Atom3dRegion アセットは Color プロパティを保持しています。これは先述のデバッグ機能で示したテキストラベル (3Dトランシーバに設定されているリージョン名等) のフォントカラーとして反映されます。Unreal Editor 上でのみ有効なデータであり、実際にビルドしたアプリケーションのパッケージ内では Color データを保持しません。
AtomTransceiverBox は、CRI ADX2 の空間音響接続機能「3Dトランシーバー」をプログラムレスで使用するためのブループリントクラスです。コンテンツブラウザ上から AtomTransceiverBox ブループリントアセットをドラッグアンドドロップしてマップに配置するだけで、3Dトランシーバ機能を使用することができます。
上図のようにコンテンツブラウザ上で AtomTransceiverBox ブループリントアセットを表示するには、View Options からプラグインコンテンツの表示設定を有効にする必要がある点に注意してください。
コンテンツブラウザ上で AtomTransceiverBox ブループリントアセットを表示してください。このアセットをビューポートに直接ドラッグアンドドロップすることで、AtomTransceiverBox をマップに配置することができます。
AtomTransceiverBox には2つの3Dリージョンを設定することができます。前方向のリージョンと、後方向のリージョンです。それぞれ "Forward Region"、"Rear Region" と呼びます。リスナーが AtomTransceiverBox に侵入し、前方向に通り抜けた場合は前者がリスナーのリージョンとして設定されます。後方向に通り抜けた場合は後者がリスナーのリージョンとして設定されます。
例えば、下図では AtomTransceiverBox の x 軸上の前方向に赤い部屋 ("ClayRoom" リージョン)、後方向に緑色の部屋 ("Marble" リージョン) を設定するのが適切です。
また、リスナーだけでなく AtomParameterComponent も AtomTransceiverBox の通り抜けに対応しています。AtomParameterComponent をアタッチされたアクタが AtomTransceiverBox を通り抜けると、その方向に応じて "Forward Region"、"Rear Region" が自動的にこのコンポーネントにも付与されます。
次に AtomTransceiverBox が持つ Atom3dTransceiverComponent に対して各種設定を行います。ですが AtomTransceiverBox が 2 つの Atom3dTransceiverComponent を保有している点に注意してください。Atom3DTransceiverForward と Atom3DTransceiverRear です。それぞれ Forward Region 用、 Rear Region 用に当たります。先述の通り、トランシーバとリージョンは 1:1 の対応関係にあるためです。
レベル開始時、Atom3DTransceiverForward には Forward Region、Atom3DTransceiverRear には Rear Region が自動的に設定されます。下図では、3Dリスナー(カメラ)が AtomTransceiverBox の背面側のリージョン (Marble Region) に属しているとします。この場合、リスナーは Atom3DTransceiverForward からの出力音声を聴くことになります。
この場合にリスナーが聴く音声を編集したい場合は、Atom3DTransceiverForward の設定値を変更してください。
何のリージョンも付与されていないリスナーは、3Dトランシーバからの出力音声を聴くことができません。ブループリントの場合は、下記の関数ノードでリスナーに目的の Atom3dRegion アセットを設定してください。
基本的な使い方は以上になります。CRIWARE SDK for Unreal Engine には 3D トランシーバ機能のサンプルレベル (Atom160_Transceiver) が同梱されているため、動作させて挙動を確認することをおすすめします。また AtomTransceiverBox はごく小規模なブループリントクラスとして実装されており、ユーザによる改変や拡張が可能です。