第2回:ライトマップを焼いて見た目をリアルに!

※このコラムでは3ds Max Interactiveを使っていますが、Stingray 1.8をお使いの方は、文章中の3ds Max InteractiveをStingray 1.8と置き換えて進めて頂いても大丈夫です。

第1回では、Revitで作成したデータをREVIT LIVEで処理し、そのファイルを3ds Max Interactiveを使って編集する際の基本となる手順をご紹介しました。

今回はその第2回目ということで、Revitで設定したライトを3ds Max Interactiveで編集して、その照明の結果をライトマップのテクスチャとして焼き込みたいと思います。

下記のURLでライトの焼き込み処理に関して説明されていますので、併せてお読みください。
http://help.autodesk.com/view/Stingray/JPN/?guid=__stingray_help_lighting_rendering_lighting_light_baking_html

Revitで作成する建築データの内、内装も含めて設計されたデータだと、沢山のライトが設定されていることも多いです。それらのライトもRevit Liveでは引き継いでくれるようになっています。ただ、現在の変換ルールは下記のようになっています。

Revitにおけるライトの種類
スポットライト
その他すべてのライトのタイプ
変換後の3ds Max Interactiveのライトの種類
スポットライト
Omniライト(点光源)

ですので、必要に応じてライトの種類をOmniからスポットライトに変更したり、ライトのパラメータを調整したりしないと、それなりの見た目を再現することが出来ないので注意してください。

ライトの点灯の確認はLive EditorではキーボードのLキーがショートカットキーになっており、ライトのONとOFFが切り替えられるようになっています。また、画面下部の中央にある、Sunのボタンで時間を夜へと動かすと、自動的にライトがONとなるようになっています。

その他、便利なショートカットの一覧はこちらです。

エディター内のショートカット
オペレーション ショートカット 説明
アンドゥ Ctrl-Z
リドゥ Ctrl-Y
Shift-Ctrl-Z
削除 DEL Backspace も利用可能
戻る/閉じる Esc 編集モードからプレゼンテーションモードに戻る、及びダイアログボックスを閉じる
シーン内のショートカット
オペレーション ショートカット 説明
ライト(サイクル) L 自動、オン、オフの切り替え
FOV (狭く) J 角度を大きくして、FOVを狭く
FOV (広く) K 角度を小さくして、FOVを広く
ピン (表示/非表示) M ピンの表示/非表示の切り替え
VR (enter) V
プロファイリングツール
(表示/非表示)
Ctrl+Alt+P パフォーマンスの分析ツール表示/非表示の切り替え
ホーム Home ホームのビューに戻る
ヘルプ F1 ヘルプのオーバーレイ表示を開く
ナビゲーション
オペレーション ショートカット 説明
前進 W、上矢印、5
後退 S、下矢印、2
A
D
左に曲がる Q、4
右に曲がる E、6
上昇 Page Up
下降 Page Down
スピードアップ Shift Shiftキーを押しながらナビゲーション用の何かのキーを押すと高速に動作

ちょっと話がそれましたが、ここからライトマップの焼き込みを行い、焼き込んだ後にReflection Probeを書き込み、ちょっとしたレンダリングのクオリティアップを図っていきたいと思います。なぜライトのON/OFFではダメなのか疑問に思われる方もいらっしゃると思いますが、その辺りはコラムの別の回でご紹介します。

前回から使っている、RevitのサンプルファイルをLIVEで処理すると、室内の表示はこんな感じです。天井は暗いですね。また、ライティングも直接光のみしか表示出来ていないので、あまり綺麗ではありません。

RevitのサンプルファイルをLIVEで処理した結果
RevitのサンプルファイルをLIVEで処理した結果

こちらのシーンも、ライトマップの焼き込み、Reflection Probeを設定すると、こんな感じになります。天井も反射する光で柔らかくなり、影もエッジが立ったものではなく、グラデーションが緩やかなソフトシャドウになっているのが分かると思います。

イトマップの焼き込み、Reflection Probeを設定した結果
イトマップの焼き込み、Reflection Probeを設定した結果

では早速進めていきましょう。

まずは、ライトの設定です。下記のように作業をし、ライトだけをExplorerに表示させます。

ライトだけをExplorerに表示させる

フィルタ出来たら、Sunは焼き込んではいけないので、Sun以外のライトをすべて選択します。選択後、Property Editorウィンドウに表示されたパラメータで下記の点を変更します。

・Cast Shadows にチェックON

これで、ライティングによる影が計算されるようになり、影が表示されるようになります。影を落とすと、ライティングの処理に負荷がかかるので、Sunライト以外のライトは、影を焼き込む場合のみ、影を落とすようにします。

では、Living Roomのスポットライト、light_001からlight_008までのライトをすべて選択し、下記のように調整します。

Living Roomのスポットライト、light_001からlight_008までのライトをすべて選択する

続いて、キッチンのライト、light_009とlight_010の2つのライトを選択し、下記のように調整します。

キッチンのライト、light_009とlight_010の2つのライトを選択して調整する

ライトの設定はこんな感じでOKです。パラメータの設定は適宜、調整してください。

では、これからライトマップを焼き込んでいくのですが、ライトマップを焼き込むには、ライトのプロパティのBakingのパラメータをIndirectから、Direct & Indirectに変更します(上記設定画面参照)。これを行わないと、間接光(二次反射)のみライトマップに焼き込まれ、直接光のライトマップ(ライト自体の明かりや、ライトにより落ちた影)を焼き込むことができないので、注意してください。
また、Indirectを選択した際には、ビューポート内でライトを点けた結果を表示してくれますが、Direct & Indirectの場合には、ライトは自動的にOFFになり、焼きこみ用の計算にのみ使われます。これは、ライトマップで焼き込んだライトの明るさや影と、リアルタイムで計算されるライトの同時表示を避ける為にそのようになっています。
また、Sunライトはライトマップの焼き込みの際にはEnabledのチェックをOFFのままにしておきます。では、light_001からlight_010を選択して、Bakingのパラメータで Direct & Indirectにします。

ここまで作業したら、File -> Save Level で保存します。

続いて、ライトマップを焼き込む作業です。まずは、Light Bakingのウィンドウを開きます。

Light Bakingのウィンドウを開く

3ds Max InteractiveではGPUを使ったライトマップの焼き込みツールが提供されています。デフォルトの設定のまま、Bakeボタンを押すとライトマップの焼き込み時にメモリが不足してフリーズしたような挙動になってしまうので、Lightmap resolutionの値を5にします。

なぜ、フリーズしてしまうのかというと、Revit Liveのデータのライトマップの焼き込みには大量のメモリが必要になるのですが、その処理にはまず、GPUのメモリが使われ、それが足らなくなると、システムメモリが使われ、最終的にすべてのメモリを使い切ってしまうと、ディスクの仮想領域を使う形になり、スワップを起こしてしまい、ディスクへのアクセスに時間がかかり過ぎてしまい、フリーズしたような挙動となってしまうのです。

これを回避するには3つの方法があります。

1. メモリを多く搭載したデスクトップPCを利用する。Quadro P6000やM6000であれば、24GB。GeForce 1080 Ti は11GB、GeForce TITAN Xpは12GBです。システムメモリを64GB以上搭載させる。128GBが理想です。
2. Lightmap resolutionの値になるべく小さな値を設定する
3. Bake Selectionで、一部のUnitを選択して、ライトマップの必要な個所だけに対して焼き込みの作業を行う。

このサンプルのデータを、16GBのシステムメモリを搭載しているVR Readyのノートパソコンでライトマップの焼き込みを行ったのですが、Lightmap resolutionの値を5にしないとメモリ不足となってしまいました。そうした関係で、上記で「5」としています。

この値を決める際、フリーズしたようになってしまうと、なかなか中止が出来なくなってしまうので、GPUのメモリを使い切って、システムメモリを使い切りそうな直前で、Light Baking ウィンドウのCancelやPauseボタンを押して中断することで、無駄な時間を避けることが出来ます。
その際、GPUのメモリの使用量を確認するのには、商用利用もOKなフリーソフト、GPU-Zというツールがお勧めです。下記のURLからダウンロードが可能です。
https://www.techpowerup.com/gpuz/

GPU-Z

システムメモリはWindowsのタスクマネージャーを使って確認します。下記のスクリーンショットは同じデータを96GBのシステムメモリとGeForce 1080の8GBのメモリ、合計104GBのメモリを搭載したデスクトップPCで、Lightmap resolutionの値を50で試したものです。メモリが98%使われてしまっていますので、100%になる手前で、PauseかCancelで終了します。ただ、3ds Max Interactive 1.8ではCancelやPauseを押しても、システムメモリが解放されないようですので、ライトマップの焼き込みをテストしている際に、90%以上のメモリを使う状況になってしまったら、一旦終了して、3ds Max Interactive 1.8を再起動する方が安全です。

タスクマネージャー

3ds Max Interactiveのライトマップの焼き込みの進捗を確認するには、ビューポートの表示と設定を変更します。
Full Render -> Lighting -> Diffuse Ambient にすると、ライトマップとして焼き込まれるDiffuse Ambientの情報がリアルタイムに確認できます。

Full Render -> Lighting -> Diffuse Ambient にすると、ライトマップとして焼き込まれるDiffuse Ambientの情報がリアルタイムに確認できる

また、Update ModeをInteraction Onlyにすると、Stingrtayのビューポートの更新が止まり、GPUのリソースをライトマップの焼き込みに回せるようになりますので、ライトマップの焼き込みを行う際にはそうして下さい。ただ、Interaction Onlyだと、ビューポートの移動がショートカットキーを実行しても上手くいかないことがありますので、ライトマップの焼き込み処理が終わったら、When Focusedなどに戻すのを忘れないようにしてください。

Update ModeをInteraction Onlyにすると、Stingrtayのビューポートの更新が止まり、GPUのリソースをライトマップの焼き込みに回せるようになる

では、Light Baking のパネルにある、Bakeボタンを押します。

が、。。。。 何も変わりません。。。失敗したというダイアログが表示されます。

失敗したというダイアログが表示されます

画面左下のAsset Browserの隣のタブ、Log Consoleの画面に切り替えて見ると、UVセットが無い、という警告が沢山表示されています。これは、LIVEから持ってきたUnitのモデルにはライトマップを焼き込む為の、Secondary UV Channelがない為に起こっています。

Log Consoleの画面に切り替えて見ると、UVセットが無い、という警告が沢山表示されています

では、各Unit内のmeshの焼き込み用のUVチャンネルを作成していきます。

まずは、テーブルを選択し、RMBクリックで、Open Selected in Unit Editorで、Unit Editorを開きます。

Unit Editor

開いたら、meshを選択し、プロパティのGenerate UV-unwrapにチェックを入れ、ONにします。

meshを選択し、プロパティのGenerate UV-unwrapにチェックを入れ、ONにします

これを、ライトマップを焼き込むすべてのUnitに対して行っていきますが、Revitから送られてきたUnit数が多ければ多いほど、こんな面倒な作業やりたくありません。。。

そこで活躍するのが、3ds Max Interactive1.8から提供された、下記の2つのプラグインです。
・Unit Utils
・Infraworks Utils

インストールするには、Window → Plugin Manager を開き、Get more plugins をクリックします。

Plugin Manager

Unit Utils をクリックし、右側に表示される Install ボタンを押します。
続いて、Infraworks Utils をクリックし、右側に表示される Install ボタンを押します。

Unit Utils をクリックし、右側に表示される Install ボタンを押します。続いて、Infraworks Utils をクリックし、右側に表示される Install ボタンを押します。

インストールが完了したら、Asset Browserで、units内にあるすべてのユニットを選択します。
選択したら、RMB → Generate UV Unwrap を実行します。このメニューは先ほどインストールしたプラグインで提供されている機能の一つです。

RMB → Generate UV Unwrap を実行

UVの生成がはじまり、右下を見ると、コンパイル中であることが分かります。この処理はUnit内のmeshの頂点数が多い場合には時間がかかることがあるので、しばらくそのままで待ちます。

コンパイル中

これで、焼き込み準備はOKです!では、File → Save Level をした後、いよいよライトマップの焼き込みです。Light BakingウィンドウのBakeボタンを押して、焼き込みを行います。

ですが、あれ?Living Roomは焼き込まれていますが、キッチンは真っ黒です。。。

まっくろなキッチン

よーく見ると、Kitchenのスポットライトの円錐の尖った先端部が、照明器具の中に埋まってしまっています!つまり、影を落とす設定にしてあるので、照明器具の中に埋まってしまっていると、照明器具の中だけが照らされてしまい、照明器具の外に光がでて来ない状態なのです。ということは、ライトの先端部分を照明器具の外に出るように少し下げてあげます。キッチンにはライトが2つあるので、それぞれ調整します。こんな感じです。
調整し終わったら、Levelを保存します。

キッチンの照明を調整

では、気を取り直して、再開です。問題なさそうですので、しばらくそのまま放置して処理を待ちます。デフォルトの設定では64回計算してSaveを押すと完了しますが、途中でいい塩梅になった時点で、Pauseして、Saveすることも可能です。

気を取り直して、再開
気を取り直して、再開

ですが、良く見ると、このデータ、窓の外にライトの光が漏れていません(赤丸で囲った場所)。キッチンのスポットの角度はかなり広い角度で、減衰の距離も十分余裕があるのに、窓の外に光が出ていないのです。

窓の外にライトの光が漏れていません

これは、窓が障害物となって、光源が遮られてしまっている為です。
一旦、Light BakingをCancelボタンを押して中断し、窓などの透明なものの外側にも影響を与える為に、窓のプロパティの中にあるLightmap mesh settingsの中にある、ContributesのチェックをOFFにします。

窓などの透明なものの外側にも影響を与える為に、窓のプロパティの中にあるLightmap mesh settingsの中にある、ContributesのチェックをOFFにする

ここで、再度、Bakeの処理を開始すると、今度は正しく窓の外にも光が漏れるようになりました。

この窓の設定は、すべての窓に対して行う必要があります。キッチンの窓はすべてProperty Editorから編集できるのですが、Unitによっては、窓のガラスとなる部分のmeshの設定のみ変更する必要があります。

例えば、リビングルームの窓です。Property Editorを見ても、先ほどのような設定が見えませんが、Lightmap settingsという階層の中に、2つのノードが見えています。

Lightmap settingsという階層の中に、2つのノードが見えています。

このどちらかが、窓で、もう一つが窓枠なのですが、どちらが窓なのかを把握するには、窓を選択して、右マウスクリックで、メニューを開き、Unit Editorを起動して確認します。

窓を選択して、右マウスクリックで、メニューを開き、Unit Editorを起動して確認します。

すると、Windows-Single_Window-735853__o_part_1という方のノードが窓ガラスということが分かるので、Property EditorでWindows-Single_Window-735853__o_part_1を選択して、Contributesのチェックを外してOFFにします。この作業をリビングルームの窓すべてに対して行います。

Property EditorでWindows-Single_Window-735853__o_part_1を選択して、Contributesのチェックを外してOFFにします

Contributesのチェックを外し終わったら、再度、Bakeボタンを押してライトマップの焼き込みを開始します。今度は窓の外への光も反映されているのが確認できます。適当なところで、Bake Lightmapsのウィンドウで、Pauseボタンを押し、Saveを押します。

Contributesのチェックを外し終わったら、再度、Bakeボタンを押してライトマップの焼き込みを開始

もしくは、最後まで処理を待つと3ds Max Interactiveのウィンドウの下部に、Light baking finished. Saving result…と表示されます。
ライトマップの焼き込みに関わる右下の進捗表示が終了したら、File -> Save Allでライトマップを保存します。すると、ライトマップのテクスチャデータに対するコンパイルが走り、完了するとライトマップが保存され表示に使われるようになります。

Light Bakingウィンドウ内の焼き込みの設定に関するティップスですが、処理時間は Lightmap resolutionとTotal sample passesの値に比例して長くなります。

時間 ライトマップのリアルさ
Lightmap resolution 値に比例して長くなる 値に比例して向上。
Bake Selectionを使って、面積の大きな面は大きな値にし、面積の小さなものは小さな値にして、必要に応じて設定を変えると良い。
例:壁、床、天井などは30以上、小物関係は10以下
Total sample passes 値に比例して長くなる 値が大きければ大きいほど向上。
但し、Lightmap resolutionの値が小さい場合には大きくしてもテクスチャ解像度が小さくて品質が上がらないので、Lightmap resolution との兼ね合いで、値を調整するとよい。できれば、大きな面には1024を設定し、一晩掛けて処理をするとよい。

ビューポートのDiffuse Ambientの表示をFull Renderに切り替え、View->Gizmoのチェックを外すと、焼き込んだ結果が確認できます。どうでしょうか?見た目は変わりましたか?2次反射以降の陰影が反映されると、リアルさがアップするのが分かると思います。

その他、ライトマップの焼き込み時に注意することとしては、下記のものがあります。

・ライトマップの焼き込みのトライアンドエラー
ライトマップを焼き込んで、保存した後、新たにライトマップを焼き込むオブジェクトが増えたり、ライトが増えたりする場合には、一旦、焼き込んだをClearしてから、焼きなおさないと、エラーとなります。
なので、時間をかけたライトマップを何度もClearすることが無いように、最終のライトマップの焼き込みまで、は長時間費やさず、短時間で確認できるような作業をすることが重要です。

・ライトマップの焼き込み時、Revitのデータ自体が大きな建物の場合
全体のUnitをLayerである程度の数に分割にし、似た者同士で纏めて焼き込む。小物は30分程かける程度で、Lightmap Resolution=10程度、Total Sample = 512で開始し、ある程度のクオリティが出たら、停止して保存しています。壁や床や天井はLightmap Resolution=70~100、Total Sample = 1024~2048で開始し
一晩焼き込み、朝、停止して保存する。
すべてを焼き込むのではなく、綺麗に見せる必要がある個所だけ選択して焼き込むようにするのも有効な手法です。

・ライトマップの焼き込みの設定の推奨値
Lightmap Resolutionの値が50以上あればかなり綺麗になりますが、Level内のUnit数が多いと、その分Lightmapのテクスチャ量も増え、何十GBにもなってしまうことがあります。そうなると出来上がったものを実行した際に、GPUのメモリに乗り切らず、システムメモリまで使い、処理落ちしてしまうコンテンツになってしまいます。また、Resolutionの値の大きさは処理時間に比例し、Total Sampleの値の大きさも
処理時間に比例します。Unit数が増えるとライトマップのファイルサイズが比例して大きくなります。大きな値を設定してテストする際には、GPU-Zのメモリ使用量とタスクマネージャーのメモリ使用量を確認しながら行い、スワップしそうな場合には焼き込みをキャンセルし、小さな値に設定しなおす、ということを繰り返して、利用するPCで処理可能な値を見つけることが重要です。
つまり、万能な推奨値はなく、データや、ターゲットとなるハードウェアのGPUのメモリ量に合わせて調整する必要があるのです。

ちょっと横道にそれましたが、では早速ここまでの作業結果をLive Editorに戻して確認してみましょう。このデータをLIVEに戻すのですが、戻す前に、SunのLightを選択し、EnabledをONに戻して、Levelを保存しておきます。戻さないと、LIVEで太陽光が表示されなくなってしまうので、注意して下さい。

Live Editorにもどす

皆さん、第1回で行った手順は覚えていますでしょうか?

1.Autodesk LIVE Editor内で、今回のプロジェクトのLVMDファイルのアイコンを削除する。
2.削除が完了したら、LIVE Editorを終了する。
3.3ds Max Interactiveで作業したプロジェクトフォルダ内の、dataフォルダ内にある、アルファベットと数字のフォルダを選択して、コピーする。
4.C:¥Users¥ユーザ名¥Documents¥Autodesk LIVE ¥1.8.0¥dataの中にペーストする。
5.Live Editorを起動して、このデータを開く。

第3回は、反射の情報に使われるReflection Probeを追加して行きます。