はじめに
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に設定します。
忘れやすいので、注意しましょう!
音源の設定
次に、音源になるオブジェクト(この場合はCube)にCardboard/Scripts/AudioフォルダにあるCardboardAudioSource.csをアタッチします。
ここで、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は方向性の強さ(値が大きいほど、指向性が高く、広がりが少ない)となることがわかります。
パラメーターでの組み合わせの例をいくつか示しておきます。
次に、HierarchyのCardboardMain/Head/MainCameraにCardboard Audio Listenerがアタッチされており、有効化(チェックが入っている)されていることを確認してください。
これで、オブジェクトとCardboard Cameraの相対位置により、音が変化することがわかるはずです。
音響環境の設定
音は、周囲の周りの壁や床などので反射することで、色々と変化します。その、周囲の影響を設定します。
音響環境の設定は、Cardboard/Scripts/AudioフォルダにあるCardboardAudioRoom.csで行います。このスクリプトを、部屋に相当するゲームオブジェクトにアタッチしてください。ここでは、テキトウにDirectional Lightにアタッチしました。
すると、アタッチしたゲームオブジェクトの周囲に黄色い囲みが表示されます。音響環境の設定は、この中に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/の下のヒエラルキーに追加します。
CardboardReticleオブジェクトには「CardboardRetile」というコンポーネントがあり、以下の二つのパラメータの変更が可能です。
- Reticle Segments: 幾つの線を使ってマーカーの輪郭を描くか。たとえば、3にすると三角形、5にすると五角形になります。
- Reticle Growth Speed:近いものから遠くのものを見たとき、あるいはその反対の際に、マーカーの大きさを変化させるスピード。小さくすると、ゆっくり変化する。
これらのパラメータをもとに、CardboardRetile.csで動的にMeshを生成してマーカーを作っています。
マーカーがオブジェクトに反応するようになるには、EditorのメニューのGameObject/UI/EventSystemでEvent Systemを追加し、それにGazeInputModule.csをアタッチします。
そして、HierarchyでCardboardMain/Head/MainCameraにPhysics Raycasterコンポーネントを加えます。
これで、オブジェクトにマーカーが重なると、マーカーが反応するようになります。
視線マーカーに見られるオブジェクトの設定
見られる方のオブジェクトには、Event Triggerコンポーネントを加えます。そして、Add New Event Typeボタンを押して、Pointer Enterを選択すると、マーカーがオブジェクトに重なった時、どのオブジェクトの、どのスクリプトの、どのメソッドを呼ぶのかを選ぶことができます。
これで、視線マーカーでオブジェクトを選択できるようになります。
おわりに
v0.6は出たばかりで、公式のドキュメントが不完全です。特に、3Dオーディオの部分のパラメータの説明は不正確な可能性もあるので、そこはご容赦いただければ幸いです。