Unity
Cardboard
VR
3Daudio

(2017/4/26 追記修正)Google Cardboard SDK for Unity v0.6の3Dサウンド (Spatial Audio)と視線マーカー

More than 1 year has passed since last update.


はじめに

1/13にGoogle Cardboard SDK for Unityが0.6になりました。大きな変更は3Dオーディオ Spatial Audio公式ブログ)ですが、ほかにもVR用の視線マーカーが変更になってますね。VRアプリでよく見られるような、「近くのオブジェクトに視線マーカーをあわせると、マーカーが近くに寄って大きくなる」という動作がスムーズになっています。

そこで、この辺の新しい使い方をわかる範囲で整理してみます。新しい情報が入ったら、適宜アップデートするつもりです。

追記:以下、3Dオーディオについて、GVR Unity SDK v1.40.0で変更になっている部分を修正、追記しました(2017/4/26)。


1.3Dオーディオ Spatial Audioの使い方


Google Cardboard SDKの3Dオーディオの特徴

Unityで使える、無料のVRアプリ用の3Dオーディオとしては、すでにOculus Audio SDKがありますが(紹介記事)、それとCardboard SDKではだいぶ使い方が違います。

Oculus Audio SDKでは音源はすべて「点」として考えて、音が周囲に一様に広がると仮定するのに対し、Cardboard SDKでは以下に示すようにDirectivity(音の方向性)の設定が可能です。また、Oculus Audio SDKではAudio mixerでシーン全体に対して反響などの音響環境を設定した(最新のSDKでは、シーンの一部に対して設定可能)のに対して、Cardboard SDKではAudio Roomという形で、シーン内の決められたエリアに限定した形で音響環境を設定できます。これらはかなり便利な機能ですが、その分、3Dオーディオの設定も複雑になっています。

(2017/4/26 追記修正)Googleのサイトのほうに、Spatial Audioに関する英語の解説が掲載されているので参考にしてください。また、Spatial Audioのサンプルは、GVR SDKのレポジトリをクローンし、Samples/SpatialAudioフォルダにあるプロジェクトを開いてください。


Editorの設定

Cardboard SDKで3Dオーディオを利用するには、まずEditorでProject Settings/Audioの中のSpatializer PluginをCardboardAudio Spatializerに設定します。

AudioSpatilizer.PNG

忘れやすいので、注意しましょう!


音源の設定

次に、音源になるオブジェクト(この場合はCube)にCardboard/Scripts/AudioフォルダにあるCardboardAudioSource.csをアタッチします。

AudioSource.PNG

ここで、3Dオーディオに関してはVolume 2つのパラメータを設定できます。


  • Volume Rolloff: どの距離で音が聞こえるかを設定します。UnityのVolume Rolloffの設定に準拠しているので、そちらをご覧ください。


  • Directivity: 音の方向性を決められます。 右に表示される極座標グラフは、以下の計算式に基づいています。


float r = Mathf.Pow(Mathf.Abs((1 - alpha) + alpha * Mathf.Cos(theta)), order)

ここで、rは半径(距離)、thetaは角度を表します。この式によれば、alphaは角度成分の程度の強さ(つまり、広がり方の形)、orderは方向性の強さ(値が大きいほど、指向性が高く、広がりが少ない)となることがわかります。

パラメーターでの組み合わせの例をいくつか示しておきます。

Directivity01.PNG

Directivity0_5__1.PNG

Directivity0_5__10.PNG

Directivity11.PNG

次に、HierarchyのCardboardMain/Head/MainCameraにCardboard Audio Listenerがアタッチされており、有効化(チェックが入っている)されていることを確認してください。

Listener.PNG

これで、オブジェクトとCardboard Cameraの相対位置により、音が変化することがわかるはずです。


音響環境の設定

音は、周囲の周りの壁や床などので反射することで、色々と変化します。その、周囲の影響を設定します。

音響環境の設定は、Cardboard/Scripts/AudioフォルダにあるCardboardAudioRoom.csで行います。このスクリプトを、部屋に相当するゲームオブジェクトにアタッチしてください。ここでは、テキトウにDirectional Lightにアタッチしました。

room.PNG

すると、アタッチしたゲームオブジェクトの周囲に黄色い囲みが表示されます。音響環境の設定は、この中にAudioListenerがあるときのみ有効になります。この囲みの大きさはCardboardAudioRoom.csのsizeパラメータで変更できます。Sizeの設定は反射・反響の性質にも影響するので、部屋のサイズに合わせて正確に設定しましょう。

CardboardAudioRoom.csには、ほかにも上下左右前後の壁の材質の設定(Surface materials), 反射の程度の設定(Reflectivity), 反響の程度の設定(Reverb properties)が可能です。


Reflectivity (反射)

Reflectivityは0~2まで設定できますが、0にすると、「フラット」な感じ、つまり音源からの直接音だけが聞こえます。Reflectivityを大きくすると、音源からの直接音に加え、少し遅れてやってくる、反響音が混じって聞え、より「厚み」のある音になります。

たとえば、相手が自分の耳に直接話しかけてくる、というように直接音が主と予想される場合は、Reflectivityは小さくないと不自然ですが、普通に部屋にいて、そこにおいてあるものの音を聞くなら、反射はある程度必要になるでしょう。


Reverb (反響)

Reverb propertiesは、大きいホールなどで感じられる反響の強さを設定します。


  • Gain (dB): 反響の強さです。値が低いと、反響は無くなります。

  • Brightness: 反響の音の性質です。大きいと高い音の反響が強くなり、小さいと低い音の反響が強くなります。

  • Time: 反響の減衰する時間の長さです。値が大きいと、「うわぁんうわぁんうわぁん、、、」という感じ(音楽ホールの中のような雰囲気)で、長く続く反響が聞こえ、小さくなると、すぐに収まる感じ(野外のような雰囲気)の反響になります。


2.視線マーカー(ポインター)の使い方


SDK v0.5xとの違い

v0.5xでは、マーカーとしてスプライトなどのゲームオブジェクトを使いましたが、ver 0.6では以下に示すように、Meshを動的に生成します。そのため、以前のようにスプライトでマーカーを作ることは出来なくなりました。ちょっと残念ですね。その分、マーカーの動きがスムーズになったので、痛し痒しでしょう。


マーカーのセットアップ

「THETAとUnityでVR英語教材を作ってみる」という私の以前の記事で紹介したマーカーのセットアップ方法は使えません。新たに「CardboardReticle.prefab」をCardboardMain/Head/MainCamera/の下のヒエラルキーに追加します。

Reticle.PNG

CardboardReticleオブジェクトには「CardboardRetile」というコンポーネントがあり、以下の二つのパラメータの変更が可能です。

ReticleParameter.PNG


  • Reticle Segments: 幾つの線を使ってマーカーの輪郭を描くか。たとえば、3にすると三角形、5にすると五角形になります。

5kakkei.PNG


  • Reticle Growth Speed:近いものから遠くのものを見たとき、あるいはその反対の際に、マーカーの大きさを変化させるスピード。小さくすると、ゆっくり変化する。

これらのパラメータをもとに、CardboardRetile.csで動的にMeshを生成してマーカーを作っています。

マーカーがオブジェクトに反応するようになるには、EditorのメニューのGameObject/UI/EventSystemでEvent Systemを追加し、それにGazeInputModule.csをアタッチします。

GazeInputModule.PNG

そして、HierarchyでCardboardMain/Head/MainCameraにPhysics Raycasterコンポーネントを加えます。

PhysicsRaycaster.PNG

これで、オブジェクトにマーカーが重なると、マーカーが反応するようになります。


視線マーカーに見られるオブジェクトの設定

見られる方のオブジェクトには、Event Triggerコンポーネントを加えます。そして、Add New Event Typeボタンを押して、Pointer Enterを選択すると、マーカーがオブジェクトに重なった時、どのオブジェクトの、どのスクリプトの、どのメソッドを呼ぶのかを選ぶことができます。

EventTrigger.PNG

これで、視線マーカーでオブジェクトを選択できるようになります。


おわりに

v0.6は出たばかりで、公式のドキュメントが不完全です。特に、3Dオーディオの部分のパラメータの説明は不正確な可能性もあるので、そこはご容赦いただければ幸いです。