空間音響接続機能「3Dトランシーバー」

サンプルのディレクトリ

/cri/pc/samples/criatomex/control_3d_pos_transceiver

サンプルの解説

空間音響接続機能「3Dトランシーバー」は従来の3Dポジショニングを拡張する機能です。
機能の具体的な説明は空間音響接続機能「3Dトランシーバー」をご参照ください。
3Dポジショニングについてはサンプル:3Dポジショニングの解説をご参照ください。
トランシーバーを用いて空間音響表現を実現するには、以下の要素が必要です。

3Dトランシーバーハンドルのパラメーター設定はリスナーや音源同様に以下の関数を使います。

パラメーター設定後、実際にパラメーターを反映するにはい以下の関数を使います。

3Dリージョンはゲームの3D空間上での領域を表現します。リスナー、音源、 トランシーバーに設定を行う際は以下の関数を使います。
3Dトランシーバーを用いた3Dポジショニングを行うコードを以下に示します。
    /* 変数宣言 */
    CriAtomEx3dListenerHn listener;
    CriAtomEx3dSourceHn source;
    CriAtomEx3dTransceiverHn transceiver;
    CriAtomEx3dRegionHn region_a, region_b;
    CriAtomExVector pos;

    /* 各オブジェクトの作成 */
    listener = criAtomEx3dListener_Create(NULL, NULL, 0);
    source = criAtomEx3dSource_Create(NULL, NULL, 0);
    transceiver = criAtomEx3dTransceiver_Create(NULL, NULL, 0);
    region_a = criAtomEx3dRegion_Create(NULL, NULL, 0);
    region_b = criAtomEx3dRegion_Create(NULL, NULL, 0);

    /* EXプレーヤーに音源、リスナーを設定 */
    player = criAtomExPlayer_Create(NULL, NULL, 0);
    criAtomExPlayer_Set3dListenerHn(player, listener);
    criAtomExPlayer_Set3dSourceHn(player, source);

    /* リージョンの設定 */
    criAtomEx3dListener_Set3dRegionHn(source, region_a);
    criAtomEx3dSource_Set3dRegionHn(source, region_b);
    criAtomEx3dTransceiver_Set3dRegionHn(transceiver, region_b);

    /* パラメーターの設定 */
    pos.x = 0.0f;
    pos.y = 0.0f;
    pos.z = 0.0f;
    criAtomEx3dSource_SetPosition(source, &pos);
    criAtomEx3dSource_Update(source);
                :
    criAtomEx3dListener_Update(listener);
                :
    criAtomEx3dTransceiver_Update(transceiver);

    /* 再生開始 */
    id = criAtomExPlayer_Start(player);
                :
    pos.x += 10.0f;
    criAtomEx3dSource_SetPosition(source, &pos);
    criAtomEx3dSource_Update(source);
                :
    /* リスナーのリージョン変更 */
    criAtomEx3dListener_Set3dRegionHn(listener, region_b);
    criAtomEx3dListener_Update(listener)
サンプルプログラム:シーン1

ADX_A_66_3DPOS_Transceiver.png

サンプルプログラム:シーン1は、部屋のような別の空間の中の音が、 開口部から漏れ出してくるようなデザインを想定しています。
図で3Dトランシーバーと示している場所には2つのトランシーバーが入力位置と出力位置を同一座標にして設定されており、 屋外と屋内のリージョンに所属している音源をそれぞれまとめて出力します。
これは3Dリージョン一つにつき3Dトランシーバーが一つ必要であるという仕様によるものです。 これにより2つの空間の接続部には3Dトランシーバーが2つ必要になります。
本サンプルではリスナーの座標を監視し、3Dリスナーが屋外にいるか、 屋内にいるかを判定し、適切なリージョンを3Dリスナーにセットしています。
3Dトランシーバーの動作の基準は、3Dリージョンですので、 ゲームプログラムでは3Dリージョンの設定を適切に行ってください。
    /* リスナーのリージョン切替 */
    /* Switch region of listener */
    if (0.0f < listener->transform.pos.z) {
            listener->region_index = 0;
    } else {
            listener->region_index = 1;
    }
    criAtomEx3dListener_Set3dRegionHn(listener->hn, s_app_obj->regions[listener->region_index]);


本サンプルでは3Dトランシーバー周辺でクロスフェードを行っています。 クロスフェードの動作については空間音響接続機能「3Dトランシーバー」のページをご参照ください。
関連API
サンプルプログラム:シーン2

ADX_A_67_3DPOS_Transceiver.png

サンプルプログラム:シーン2は、別の空間の中の音が、 トランシーバーによって別の空間に出力されるようなデザインを想定しています。
3Dトランシーバーは1つで、屋内にいるリスナーに対して屋外の音を3Dトランシーバーが伝えます。
3D音源から3Dトランシーバーまでの間でも3Dポジショニングの計算が行われているので、 ヘリの音源が遠ざかるにつれトランシーバー出力から出る音も小さくなることが確認できます。

CRI Middleware logo Copyright (c) 2006-2018 CRI Middleware Co., Ltd.