1. はじめに

前回の記事では、 VR プロジェクトの開発に必要な環境について紹介しました。今回は、自社のオフィスのワンフロアを再現したプロジェクトを例に、実際のVRプロジェクト開発の様子や感想について、写真を交えながら紹介したいと思います。

前回の記事はこちらかお読み頂けます。

https://www.users-digital.com/2021/04/15/user_vr03/

2. VR プロジェクト開発の流れ

ここからは、VRプロジェクト開発の流れについて紹介します。VRプロジェクト開発には、大きく分けて4つの工程がありますのでそれぞれについて説明します。

① VR ワールドモデリング

VR

ワールドモデリングとは、VRプロジェクトで作成するワールドを作る作業を指します。今回は、前回の記事で紹介したBlenderを用いて、オフィスの間取りなど大枠をワールドモデリングで再現しました。

② VR ワールド上のオブジェクト配置

VR

ワールドモデリングを終えると、次に行う作業がオブジェクトの配置です。オブジェクトの配置とは、作ったワールドの中に、実際にモノを置く作業のことを指します。今回は、前回の記事で紹介したアセットストアで買った机や椅子などの小物を置きました。

③ ライティング

VR

オブジェクトの配置を終えると、次に行うのがライティングです。ライティングとは、オブジェクトに光を当てる作業のことを指し、仕上げの段階で3Dモデルや制作した環境の見栄えを調整することを目的に行います。

④ 軽量化

VRプロジェクト開発で最後に行う作業が、軽量化です。VRの場合、ワールドが重くて動かないことがVR酔いを引き起こし、健康に害を及ぼす恐れがあるため、軽量化の作業が特に重要です。軽量化には、主にワールドの処理を軽くする方法とワールドの容量を軽くする方法の2つがあります。

I. ワールドの処理を軽くする

VR

まず、Unityで制作された3Dコンテンツには「ドローコール」という概念があります。これは、1フレームで何回CPUからGPUへ描画命令を送っているかを示す値です。ドローコールが増えると、処理の回数が増えて、フレームレート(1秒間の動画が何枚の画像で構成されているかを示す単位)が下がり、動作が遅くなります。つまり、ワールドの処理を軽くするには、ドローコールを減らす必要があります。ドローコールを減らす方法は、大きく分けて3つあります。

A) メッシュのベイク

例えば、自社のオフィスのワールドに椅子を並べていって、最終的に60個の椅子を置いたとき、ドローコールは少なくとも60回以上となり、1フレーム進むごとに最低でも60回の指示がCPUからGPUへと送られて処理されます。しかし、メッシュベイクをすることで、1個1個並べた椅子をまとめて、「1つの物体」として固めることができます。イメージとしては、Excelにあるオブジェクトのグループ化に近いです。

こうすることでドローコールを減らし、実際にワールドにいる際の軽量化、つまりフレームレートの向上が見込めます。一方、メッシュをベイクしてしまうと「一つの物体」として認識されるため、「やっぱりこの椅子はもう少し右に移動しよう」という修正ができません。したがって、基本的にメッシュベイクは、ワールドの形がほとんど決まってから行うものとされています。軽量化の作業を最後に行うのも、このような背景があります。

B) ライトのベイク

ライトの種類は、3つあります。

  • 1フレームごとに毎回光の当たり方を計算するRealtime
  • あらかじめ光の当たり方や影を計算しておいてテクスチャに焼き込むBaked
  • RealtimeとBakedの混合ライトであるMixed

ここでは、Mixedライト以外の2つについて説明します。Realtimeは、その名の通り1フレームごとにライトの当たり方や影をCPUが計算し、その描画処理をGPUに指示します。先ほどあげた「ドローコール」と同様で、CPUからの指示が多ければ多いほど負荷がかかり、フレームレートが下がってしまいます。つまり、Realtimeライトは重くなりやすいのです。そこでワールドに実際にいるときにライトの処理を重くしない手段の1つとして、Unity上であらかじめ光の当たり方や影の計算をして、あたかも光が当たっているかのようにテクスチャに描きこんでおくBakedライトを使う方法があります。

C) オクルージョンカリングの設定

オクルージョンカリングの設定をおこなうと、「視界にオブジェクトが入らないと描画されない」という状態になります。これもドローコールの削減になり、無駄な処理がなくなるので、その分処理が軽くなります。しかし、先程説明したメッシュベイクとオクルージョンカリングの設定を併用すると、オクルージョンカリングの設定をしていてもまとめてメッシュベイクしたもののうち一つでも視界に入った時に全てが描画されてしまいます。そのため、広い場所をメッシュベイクする際は、オクルージョンカリングを意識して区画で分けてメッシュベイクしていく必要があります。

II. ワールドの容量を軽くする

VR

ワールドの容量を軽くすることは、ロード時間を短くすることに繋がります。ワールドの容量を軽くする方法は、主に3つあります。

A) FBXファイルの圧縮設定を変更

アセットフォルダ内に存在しているFBXファイルのInspectorから「Mesh Compression」の値を変更します。初期値はOffで、LowよりもMedium、MediumよりもHighの方が、圧縮率が高く容量を小さくできます。

B) テクスチャの圧縮

Unityの設定画面からオブジェクトのテクスチャを圧縮することで、ワールドの容量を軽くできます。ただ、テクスチャを圧縮すると画像が汚くなってしまうため、目立たない場所やクオリティを求めないオブジェクトのテクスチャを下げることをお勧めします。

C) Dynamic Materialsの数を減らす

ワールド内に存在しているマテリアルの数のことを「Dynamic Materials」といいますが、これを減らすことも、ワールドの容量を軽くすることにつながります。

3. 実際の VR 空間開発の様子

ここからは、実際のVR空間開発プロジェクトを時間の経過とともに、画像を交えて紹介します。今回のプロジェクトは、自社オフィス内のフロア1つを再現するもので、ワールドモデリングに1週間、オブジェクトの配置に1週間、軽量化に2週間の合計4週間で完了させる計画で始まりました。

① 2週目終了時

2週目終了時では、先程紹介したワールドモデリングと机や椅子などの小物を置く作業が一通り完了した段階まで進みました。ただ、壁など配置が終わっていないものもあり、予定していたオブジェクトの配置が完了するところまでは至りませんでした。

VR
VR
VR
VR

② 3週目終了時

3週目終了時点では、大まかなオブジェクトの配置が終わり、アセットストアになかった家具をモデリングで作成して設置しつつ、床や壁のテクスチャ設定などを完了させました。また、仮置きしていた壁を本来のガラスのように透き通った状態にもできました。この時点で前の週から発生していた遅れは、ほぼ解消されました。

VR
VR
VR
VR
VR
VR
VR

③ 現在の状況

最後に、現在の状況を説明します。3週目終了時から大きく変化したことは、3つあります。まず、リフレクションプローブ (Reflection Probe)を設置し、光源としてPoint Lightを設定しました。リフレクションプローブとは、「反射」を疑似的に表現する機能の1つです。リフレクションプローブを設定することで、鏡のような金属的な反射を表現することができます。また、光源としてPoint Lightを設定することで、焚き火の炎の明るさのような自然な明るさが表現できます。

次に、下の写真の赤枠内のように、動画再生プレイヤーを設置しました。

VR

そして、ワールドの容量を減らすために、前述したテクスチャの圧縮を行いました。

VR

現在はアニメーションを勉強中で、ドアの開閉の動きなどを再現していきたいと考えています。

VR

4. 終わりに

今回は、実際のVRプロジェクト開発の様子について、写真を交えながら紹介しました。今回のVRプロジェクト開発で、元々興味のある内容を学ぶ機会が得られたので、非常に楽しく作業できました。初めて経験する作業でしたが、当初の予定通り進められたことも大きな自信になりました。

実際のVRプロジェクト開発の様子を見て、読者の皆様はどういう感想をお持ちになりましたでしょうか。VRの質の高さや臨場感は、VRデバイスを通してみないとわかりにくい部分も多々あり、写真ではなかなかお伝えしきれないとは思いますが、VR空間がどのように作られていくのか、少しはイメージが湧いたのではないかと思います。

読者の皆様も、気になった方はぜひVRデバイス(特にOculus Quest 2)を手に入れ、実際に体感していただきたいと思います。VRの世界の無限の可能性を感じていただけると思います。

今回の記事は、以上とさせていただきます。最後まで読んで頂いた読者の皆様、ありがとうございました。