はじめに

VRの開発はUnityというゲームエンジンを使えば意外と簡単に制作できます。ここではVRの開発に必要な機材・ソフト、開発方法を紹介します。

VR開発のための環境

まず、VRプロジェクトを開発する上で推奨されているPCのスペックは、以下の通りです。

  • グラフィックカード:NVIDIA GeForce RTX 2060、AMD Radeon RX 480以上
  • CPU:Core i7-8700K以上
  • メモリ:16GB以上

(出典:Unityでつくる建築VR入門)

このスペックを満たすPCの例に、こんなものがあります。

https://www.tsukumo.co.jp/bto/pc/vr/

この様なPCは、巷では「ゲーミングPC」と呼ばれています。そもそもゲーミングPCと言われてもピンとこない読者の方もいると思いますので、その説明から始めます。

ゲーミングPCって何?

ゲーミングPCには、普通のPCと比較して以下の3つの特徴があります。

VR

ゲーミングPCの特徴1:グラフィックカードを搭載

ゲーミングPCとは、3Dゲームができるグラフィックカードを搭載した高性能なPCのことを指します。そのため、グラフィックを処理するのはCPU内蔵ではなく、GeForceやRadeonなどの専用グラフィックスを搭載している必要があります。

ゲーミングPCの特徴2:高性能なCPUを搭載

CPUの性能によって処理速度が大きく変わるため、ゲーミングPCは高性能なCPUを搭載する必要があります。特に、高い解像度を必要とする際にCPUの性能がボトルネックになるケースがあります。

ゲーミングPCの特徴3:高い冷却性能

高性能なグラフィックスは多くの熱を発するため、性能をフルで発揮させるには冷却機構が大切です。

次に、VRSNS上にワールドを作成する際はUnityを使う必要があります。Unityを初めて聞いた読者の方がほとんどだと思いますので、紹介しておきます。

Unityとは?

Unityは、モバイルゲームやパソコンゲーム、ブラウザゲームなどの製作に用いるゲームエンジンで、100万人以上の開発者が利用しています。白猫プロジェクトやポケモンGOなどプロのゲーム開発現場でも、Unityは多く採用されています。下の写真は、実際のUnityの画面です。こういった画面で、プロジェクトを開発していきます。

VR

また、Made with Unityでは、Unityを使って開発されたゲームの紹介や開発者のインタビューなどが掲載されています。皆さんがプレイしたことのあるゲームが、Unityで作られていたという発見があるかもしれません。一度チェックしてみてはいかがでしょうか。

https://madewithunity.jp/

そんなUnityには、大きく分けて2つの特徴があります。

Unityの特徴1:高いカスタマイズ性と使いやすいUI

Unityエディタにはとても多くの機能があり、開発者はこれらの機能を使うことで、より早く、質の高い作品を作ることができます。ここでは、高いカスタマイズ性を支えるスクリプト対応とUIについて簡単に触れておきます。

多様なスクリプトに対応:Unityでは、C#やJavaScript(UnityScript)を使ってスクリプトを記述することができるほか、独自のShaderも記述することができ、幅広い表現が可能です。

豊富で使いやすいUI(ユーザインターフェース):メニュー画面やアイテムリストなどで、よく使われます。ボタンやリスト、スライドバーなどUIの機能が初めから多く用意されています。

Unityの特徴2:豊富なアセットが入手できるアセットストア

3Dモデルやアニメーション、機能スクリプトやマテリアル(シェーダ)など、Unityのアセットストアには、有料・無料のアセットが何千という数リリースされており、開発者はストアからそのアセットを買うことで自分のプロジェクトで使うことができます。絵が描けない、BGMや効果音などの音が欲しい、または、簡単なプロトタイプ用にすぐアセットを用意したい場合などにアセットストアを使うことで、プロジェクトの質と開発速度を上げることができます。今回は、机や椅子などの小物をアセットストアで買いました。

上述したように、開発者はスクリプトを書くことでUnityが提供する機能を拡張したり、アセットストアでアセットパッケージを買ったりしながら、プロジェクトを作ることができます。ただ、Unityは上述したように使いやすいUIを提供しているので、基本的な操作などUnityに初めから搭載されている機能を使う分にはC#やJavaScriptが全くわからなくても問題ありません。イメージとしては、プログラミング言語が全くわからなくてもWindowsのPCを使うのに困らないのと似ています。筆者も、今回UnityでVRプロジェクトを開発することを取り上げた書籍を3冊入手しましたが、C#やJavaScriptを理解していることを前提としたものは1冊もありませんでした。

Unityでの開発に慣れてきて、Unityに初めから搭載されている機能だけでは物足りないと感じてきたら、C#やJavaScriptを勉強するといった形で十分だと思いました。むしろ、初めからUnityを使いこなそうとしてC#やJavaScriptを勉強するところから始めると、ハードルが上がってしまい挫折してしまう可能性が出てくるかも知れません。

また、VRSNSにワールドを作成する際の特有の問題として、VRSNSによって対応しているUnityのバージョンが異なることがあります。開発する際は、自分がワールドを作成したいVRSNSが対応しているUnityのバージョンを確認する必要があります。そして、Unityを動かす際には、Unity Hubをインストールしておくと便利です。ここでは、Unity Hubについて紹介します。

Unity Hubとは?

Unity Hubは、Unityのプロジェクトとあらゆるバージョンのインストーラの検索やダウンロード、管理などを効率化するスタンドアロンアプリケーションです。また、すでにマシンにインストールされているエディタのバージョンをUnity Hubに手動で追加することもできます。Unity Hubを使用すると、以下を行うことができます。

  • Unity アカウントとエディターライセンスを管理できる
  • プロジェクトを作成し、Unity エディタのデフォルトバージョンとプロジェクトを関連付け、複数バージョンのエディタのインストールを管理できる
  • Unity の優先バージョンを設定するだけでなく、プロジェクトページから簡単に他のバージョンを起動することもできる
  • エディタを起動せずにプロジェクトのビルドターゲットを管理および選択できる
  • 同時に2つのバージョンの Unity を実行できる
  • 既にインストールしたエディタにコンポーネントを追加できる
  • プロジェクトテンプレートを使用して、通常タイプのプロジェクトの作成プロセスにすぐに取りかかることができる

今回のプロジェクトでは、ワールドを作る際の3DモデリングにBlenderを使用しました。Blenderを使用したのは、UnityがBlenderのアートアセットとファイル形式に対応しており、アセットをUnityのプロジェクトに追加したり、UnityのUIで管理したりすることができるからです。ここで、Blenderについて紹介します。

Blenderとは?

Blenderは、本格的かつ商用のハイエンドクラスにも引けを取らないほど高機能な3DCGソフトウェアです。WindowsやMacOS、Linuxといった幅広いプラットフォームに対応しており、ほとんどの一般的なPCで利用できます。また、Blenderはオープンソースソフトウェアとして開発・配布されているため、無料で使うことができ、商用・非商用にかかわらず自由に使うことができます。

さらに、オープンソースソフトウェアのため世界中のプログラマによって日々改良が加えられるので、一般的なソフトウェアでは考えられないほどバージョンアップが早く、且つその頻度も非常に高いため、次々と新しい機能が搭載されていきます。今回は、Blenderに搭載されている様々な機能のうち、代表的なモデリングを紹介します。

モデリング

モデリングとは、画面内の仮想3D空間でモデル(物体)の形を作る作業を指します。下の写真は、実際のBlenderの画面でモデリングをしている様子です。

VR

モデリングの方式には、主に2つあります。

ポリゴンモデリング

ポリゴンモデリングとは、ポリゴンと呼ばれる三角形面あるいは四角形面を組み合わせて形を作る方法のことを指します。ポリゴンモデリングは、直感的に操作することができ、次に紹介するスプラインモデリングよりも扱いやすいとされ、Blenderの入門書でもポリゴンモデリングを紹介している場合が多いです。ただ、ポリゴンモデリングは、スプラインモデリングに比べて、作ることができる形が限られるという欠点もあります。

スプラインモデリング

スプラインモデリングとは、工業製品の設計などに使われる数式的なスプライン曲線を使って形を作る方法のことを指します。スプラインモデリングは、ポリゴンモデリングよりも扱いにくく難しいとされ、上級者向けの技術ともいえます。ただ、スプラインモデリングにはポリゴンモデリングでは作るのが難しい形も容易に作ることができるという長所もあります。

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

VRプロジェクト開発には、大きく分けて4つの工程があります。

VR ワールドモデリング

VR

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

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

VR

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

ライティング

VR

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

軽量化

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

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

VR

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

メッシュのベイク

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

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

ライトのベイク

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

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

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

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

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

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

VR

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

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

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

テクスチャの圧縮

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

Dynamic Materialsの数を減らす

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

実際の 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

終わりに

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

VRの質の高さや臨場感は、VRデバイスを通してみないとわかりにくい部分も多々あり、写真ではなかなかお伝えしきれないですが、VR空間がどのように作られていくのか、少しはイメージが湧いたのでは。

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