スキップしてメイン コンテンツに移動

UE4 4.22 Preview 1 のリアルタイム・レイトレーシングを動かしてみた。

Houdini で2D 平面の地図から3D ポリゴンの街を生成する

Houdini, Houdini Game Development Toolset, Open Street Map (OSM) を使って、現実の地図から、街の建物を生成してみました。ノードベースは、生成変換の過程がわかるのが良いですね。

図 2D平面の地図(OSM) から、建物のみを3D ポリゴンに変換した結果

図 Open Street Map 2D 平面の地図

2D平面の地図(OSM) から建物の領域だけを抽出して、ランダムに適当な高さを与えて、3Dポリゴンに変換しています。地図に対応した等高情報(いわゆる Height Map)があれば、よりリアルな街並みになるでしょう。地上から地下までを階層的に生成するなど。

味噌

建物だけを抽出する際、OSM 地図データのアノテーションを使い、建物以外を抽出して削除しています。幾何情報だけでなく、意味情報を使っています。
実践としては、そういうやりかた(戦術)は、筋が良いと思います。とはいえ、地図にアノテーションが存在しない状況もあるので、幾何情報と現実の何らかの情報から3D ポリゴン生成する頑健な手法を考えておきたいところです。

課題

3D ポリゴン生成時の法線の向き

現行は、入力情報が二次元しかないので、3D ポリゴン生成時に、頂点法線が反転してしまう領域があり、そのような領域を抽出して、法線を反転して強制的に修正しています。研究的な視点だと、その等高情報を画像から推定して生成する、のは面白いと思います。

3Dポリゴン化した建物へのテクスチャマッピング(UV 座標)

3D ポリゴン化した建物の用途は、レベルデザインでのグレーボクシングと構造の把握程度までとしておきます。グラフィクスも考慮する最終レベルでは、事前にテクスチャマッピングした High Level of Detail の建物に置き換えます。

道路など建物以外のポリゴン化

建物は凸形状なので、ポリゴンの押し出し(Extrude)で容易に3D 化できました。
道路は、曲線もあります。碁盤の目である京都の街並みになら、やりやすいかも(笑)

階層化

地上から地下までをレイヤー化して、街をプロシージャル生成します。

よりリアルで自然な街並みを生成するには

長期の時間経過、自然現象のイベント、地球の自然環境を考慮したシミュレーションを実行して、街を生成します。これは研究になると思います。

参考文献

 Apprentice でも動作します。味噌は、Game Development Toolset インストール後に、Houdini を起動して、Shelf に Game を追加しておくことです。そうすると、Tab 操作で、OSM Importer などの機能が利用できるようになります。

OSM Importer を使う, Born Digital
ビルを生成する, Born Digital

Open Street Map

コメント

このブログの人気の投稿

Falcor で遊ぶ。導入編。NVIDIA Real-Time Rendering Framework

はじめに NVIDIA が公開した  Falcor Real-Time Rendering Framework  で遊んでみました。 Denoising 1spp Path Tracing, Foveated Rendering など、技術研究プロジェクトで使われたフレームワークです。DirectX12 / Vulkan に対して薄い抽象化レイヤを提供しています。オープンソースで、実験的な機能をさくさくとRAD 実装するのに使えると思い、触ってみました。今回は、フレームワークのビルドとサンプルを起動するまでの、導入メモです。 図 HDR のテスト 特徴 物理ベースのシェーディングシステム DirectX12 と Vulkan の薄い抽象化レイヤ 現代的グラフィクス技術のモジュール化されたライブラリ OpenVR を使ったステレオレンダリング カメラ、光源、メッシュのパスアニメーション ビデオキャプチャ FBX, OBJ などを含む一般的な3D アセットファイルフォーマット対応 シーンエディタで各種オブジェクトのオーサリング可能 NVIDIA のGPU でなくても、動作します。今回は、Intel Iris Plus です。 Ray Tracing など、CUDA を使う機能は、そのままでは使えないかもしれません。 Radeon Ray か、Embree か、OpenCL に置き換える、というライフワークが生まれますw 今回の動作環境 Visual Studio 2015, Windows 10 SDK 10.0.15063.0 です。 Microsoft New Surface Pro Core-i7, 16GB RAM, Iris Plus です。 step 1. GitHub から ソースコード入手 https://github.com/NVIDIAGameWorks/Falcor step 2. Falcor とサンプルのビルド 2.1. README を参照します。 Visual Studio 2015, Windows 10 SDK 10.0.14393.795 こちらの環境は、10.0.15063.0 です。 各自の環境に合わせて、プロジェクトのSDK 設定を変更してく

いきなり!Ray Tracing on Houdini VEX 2

Ray を可視化してみました。 可視化 図 Pinhole Camera から、Teapot へのRay と Reflection Ray を VEX で可視化 解像度比較 図 左 32 texels (primitives), 右 256 texels (primitives) ネットワーク 図 Simple Ray Tracer Wrangle 出力先は、screen です。 シーンは、sceneGeometry です。 今回は、Utah Teapot のみです。 manyLights は、光源へのポインタです。 morishgieGI は、大域照明(実験)へのポインタです。 raytraceWrangle が、Ray Tracing を実行するOperator です。 VEX コードの格納先です。 Ray 可視化 VEX コード raytraceWrangle で、ray がシーン内のジオメトリと交差した際、 ray の点とプリミティブを生成しています。 追加削除が、簡単に動的にできるのは、VEX スクリプトの強みですね。 // ray を可視化する 点とプリミティブを生成 // geoself(): 出力先(screen) int newPt0 = addpoint(geoself(), rayOrigin); int newPt1 = addpoint(geoself(), hit); addprim(geoself(),"poly", newPt0, newPt1); // reflection ray を可視化する点とプリミティブを生成 vector r = reflect(rayDir, surfaceNormal); int newPt2 = addpoint(geoself(), hit + r); addprim(geoself(), "poly", newPt1, newPt2); 追記:addpoint() や addprim() の第一引数は、geometry handle です。 現在の geometry に出力する場合は、geoself() を使いましょう。 現在の geometr