[Omniverse] [Blender] OmniverseのシーンをBlenderに持って行く

  • by

Omniverseのシーンはusdで管理されています。
これをBlenderに持って行く流れを調査しました。
Omniverse Create 2022.1.4とBlender 3.2で確認しています。

Nucleus上のシーンの場合 : Collect Assetでローカルに持ってくる

Nucleus上のシーンの場合は、いったん「Collect Asset」でローカルにUSDファイルを持ってくるようにします。

なお、ここではPLATEAUの東京23区のシーンを対象としました。

「Collect Asset」でローカルに展開されたusdが、Omniverse Createで開いて問題ないことを確認しておきます。
「Collect Asset」を使用すると1つのフォルダにすべての関連ファイル(usd/画像ファイルなど)がまとめられるため、環境間の移行もしやすくなります。
[Omniverse] Collect Asset : 参照ファイルを相対パスに変換」もご参照くださいませ。

Blender 3.2.1 (OmniverseのBlender 3.2 alpha USD branchではない方)を使用

通常のBlenderでもUSDのインポート/エクスポートはできますが、気になる点がいくつかありました。
インポート時に以下の問題を見つけています。

  • シーンスケール(シーン単位)が正しく変換されない
  • USDのマテリアルUsdPreviewSurface以外のMDL(OmniPBR/OmniSurface)を指定している場合、正しくインポートできない

1つめのシーン単位については、USDは厳密に寸法を解釈できるため問題になります。
2つめのマテリアルについては、「Omniverse対応している」という明示がない限りは対応されない箇所になるかと思います。
USDの仕様にのっとった場合は、これは不都合ではありません。

また、USDエクスポートでもいくつか問題を見つけています。
Blenderに標準搭載されているUSDインポート/エクスポートは、Omniverseとは現状相性があまりよくありません。

OmniverseのBlender 3.2 alpha USD branchを使用

Omniverse Launcherから「Blender 3.2 alpha USD branch」で、USDの調整がかなり行われたBlenderが使えます。

USDのインポートやエクスポートは、これを使うほうが安全だと思います。
USDを読み込んだ後に一度Blenderでファイル保存し、後は使い慣れた通常のBlenderで編集する、でもよいかもしれません。

メインメニューの「File」-「Import」-「Universal Scene Description」を選択し、USDファイルをインポートします。

インポートオプションはデフォルトのままで読み込みました。
なお、PLATEAUの東京23区のシーンを読み込んでいます。

「World」はUSDでのルートになっていました。
これがBlenderのノードとして読み込まれました。
USDのそのままの構造がBlenderでも読み込まれています。
また、WorldのObject Propertiesを見ると
Rotationが(90, 0, 0)、Scaleが(0.01, 0.01, 0.01)になっています。

これは、USDでのY-UpからBlenderのZ-Upへの変換、
USDの(デフォルトシーン単位である)センチメートルからBlenderのメートルへの変換がされていることになります。

ViewのClip Start/Endを調整

では、1つ地形(dem)のMeshを選択してフォーカスを合わせてみます。

いくらカメラを調整しても正しく描画されていません。
これは、カメラのClip Start/Endの値によるものです。
他ツールではNear/Far Clipなどと表現されたりします。
Viewportの右端の小さな「<」を選択すると、タブが表示されます。
ここの「View」を開きます。

デフォルトではClip Startが0.01(m)、Clip Endが1000(m)です。
PLATEAUの実際の地形データはもっともっと大きい形状ですので、これでは足りません。

Clip Endを100000(m)としました。

これで地形が見えてきました。

建物に近づくと、面が欠けていたりチラチラとちらつきます。

これはおそらくDepthの精度によるものと思われます。
Clip Startも調整します。
Clip Startを1(m)としました。

これで面が欠けることはなくなりました。

これでもまだ面が欠けたりする場合は、Clip Startを10(mm)など大きくすると改善されることがありました。

寸法チェック

Measureで測って、建物も実寸サイズが計測できているのを確認できます。

スムーズシェーディングを調整

USDを読み込んだ段階では建物の法線が丸まってしまってます。

Object ModeでMeshを選択し、Object Data PropertiesよりNormalsを開きます。
「Auto Smooth」をOnにすると、隣り合う面の法線が作る角度によりスムーズになるところとスムーズにならないところが自動計算されます。

これで、以下のように選択されたMeshがパキっといい感じになりました。

ちなみに、私は複数のMeshのAuto Smoothをまとめて変更する方法は知りません。
(普通にインポート時に頂点法線を元にシェーディングしてくれないもんなのだろうか、、、)

Eeveeでレンダリング

現在はテクスチャは貼られていませんが、Viewport ShadingでRenderedを選択すると
Eeveeでのレンダリングになります。

こんな感じになりました。

ただ、地形は広いからかがんばって調整しても影がうまいこと落ちませんでした。
シャドウマップの限界かどうかは不明です。
上画像は影が落ちているように見えますが、地面のテクスチャ(GEOTiffから読み込んだもの)に焼き付けられている影が表示されているにすぎません。

Cyclesでレンダリング

それでは、レイトレーシングのCyclesに切り替えてみます。
Render PropertiesでRender Engineを"Cycles"に変えました。

これで影が落ちました。

PLATEAUのLOD2の地形を読み込み、背景HDRIで盛る

BlenderでどこまでPLATEAUの地形がいい感じになるか確認するために、
LOD2の建物があるシーンを読み込んでみました。
また、背景のHDRIによるIBLも入れています。

もっと区画(地域メッシュ)の多いusdをインポートした場合は、読み込みがすごく長くなることがありました。
止まってしまっている?2時間ほどまってもほとんど進まず。
区画ごとに分けてusdを保存しておき、追加でインポートしていくほうが安全かもしれません。
PLATEAUを編集目的で扱う場合はやはりDCCツールのほうが秀でていますので、Blenderの選択肢もありかなと思っています。

今回はここまでです。