最近のゲームグラフィックの進化がすさまじいわけですが、2016年に公開されたUnityのデモンストレーション「Adam 」を見た時は、これがホントにリアルタイムCGなのか?と疑ってしまうような、実写映像と言われれば信じてしまうほどのリアルな映像に衝撃を受けました。
その「Adam」のデモで使用されている3DモデルのアセットがUnity Asset Storeで公開されていて使用できる!すごい!と喜んだものの、同じクオリティのものを簡単に作ることができるわけでもありません。基本的なところからどうやったらリアルなシーンができるのか、初歩から勉強していきたいと思います。
Unityで新規シーンを作成した際、Directional Lightは太陽光の役割をしています。野外のシーンを作る際は特に設定を変えなくても結構キレイに見えるのですが、屋内のシーンを作成するには色々と疑問点が出てきます。今回はまず環境光と間接光について調べてみたいと思います。
基本オブジェクトのCubeを使用して部屋を作ります。メニュー:File > New Sceneを選択。[Hierarchy]ウィンドウ > [Create]ボタン > 3D Object > Cubeを選択。念のため[Inspector]ウィンドウ > Transform > PositionとRotationの値がすべて0になっているか確認。先に仮のマテリアルを割り当てておきます。サイズが分かりやすいように512×512ピクセルのグリッドテクスチャを作成。
作成したテクスチャを使用してマテリアルを作成。これをCubeオブジェクト割り当てます。マテリアル割り当てができたらCubeオブジェクトを[Project]ウィンドウにドラッグしてプレハブに変換しておきましょう。
次に重要なのがスナップ設定です。オブジェクトを隙間なく並べるにスナップ設定を確認しておきましょう。メニュー:Edit > Snap Settingsを選択。[Snap Settings]ウィンドウが開いたらMoveX、Y、Xの値が0.1になっていることを確認してウィンドウを閉じましょう。
準備が終わったのでまずは床から作っていきましょう。シーンにあるCubeオブジェクトは既にプレハブとなっているのでオブジェクト名が青字になっているはずです。[Ctrl]+[D]キーで複製して並べます。スナップを有効にするために[Ctrl]キーを押したままドラッグしてX方向に6個、Z方向に6個並べます。さすがに36個のCubeをひとつずつ並べるのは面倒。実はオブジェクトを複数選択したまま[Ctrl]+[D]キーで複製できるので一気に作業が進められます。床の部分ができたら空オブジェクト作成してまとめておきましょう。[Hierarchy]ウィンドウ > [Create]ボタン > Create Emptyを選択。名前を”Floor”に変更。[Hierarchy]ウィンドウで並べた36個のCubeオブジェクトを選択し、”Floor”にドラッグすればグループ(親子)の完成。グループの中心がシーン原点がからずれている場合は揃えておいた方がいいでしょう。できあがりはこんな感じです。
床グループができたので、今度はグループごと複製しましょう。[Ctrl]+[D]キーで複製したらグループ名は”Wall Front”に変更しましょう。[Inspector]ウィンドウ > Transformの値を次の通りに変更します。
次に今作った”Wall Back”グループを複製して名前を”Wall Front”に変更。[Inspector]ウィンドウ > Transformの値を次の通りに変更します。
さらに今作った”Wall Front”グループを複製して名前を”Wall Right”に変更。[Inspector]ウィンドウ > Transformの値を次の通りに変更します。
またまた、今作った””Wall Right”グループを複製して名前を”Wall Left”に変更。[Inspector]ウィンドウ > Transformの値を次の通りに変更します。
最後に天井です。最初の床グループ”Floor”を複製して名前を”Ceiling”に変更。[Inspector]ウィンドウ > Transformの値を次の通りに変更します。
試しに新規シーン作成時に一緒についてくるDirectional Lightをオフにしてみました。色が若干変わりましたが明るいままです。
調べたところ環境光が関係しているらしいので、メニュー:Window > Lighting > Settingsを選択。[Lighting]ウィンドウを開いて確認。[Scene]ボタンをクリック > Einvironment > EnvironmentLighting > Intensity Multiplier: 0に変更、Environment Reflections > Intensity Multiplier: 0 に変更しました。
Environment Lighting(環境光)とEnvironment Reflections(環境反射)の影響を無しにしたことろで実験です、Directional Lightの光が室内に入るように天井のCubeを半分非表示にしてみました。こんな感じです。
この状態を[Game]ビューで見るとこんな感じなわけですが。光が当たってない影の部分は真っ暗。うーん、現実はこんなことないですよね。
そこで先ほど変更したEnvironmentLighting(環境光)とEnvironment Reflections(環境反射)のパラメータを元にもどしてみるとこんな感じに。そうそう、現実はこんな感じですよね。
あらためてUnityの公式マニュアルの「ライティングの概要 」読んでみました。
大まかに言うと、Unityのライティングには「リアルタイム」なものと「事前計算」によるものがあり、両方組み合わせて使うことでシーンのライティングをより印象的にできます。
ということで、今回のように特に設定を変更せずに行った設定は「リアルタイムライティング」ということでした。次回は「事前計算」のライトマップのベイクを試してみたいと思います。