【CG】サクッと、鳥瞰図・断面図表現をしよう【UE4】

Pocket

そういやUE4ってタイトルに含めていますが、UE5が出たらSEOに響くのかなと気になってきましたが。まあ2つ作ればいいか。

さて、ビルディングや商業建築関連だと出番が少なさそうですが、戸建住宅だとほぼ必須の鳥瞰図や断面図の表現。もちろんUE4で簡単にいけます。
要はカリングクリッピングをするだけです。

やりかた

いくつか方法があります。
今回は2階をON/OFFしてみましょう。

1.Cull Distance Volumeを使う

1-1.とにかく消す

とにかく指定した領域内をごっそり消せます。
最短時間で直感的にできるのが魅力かと。

[モード]ウインドウで[Cull]と入力すれば出てきます。
Cull Distance Volumeをビューポートに配置。操作感はTrigger Volume等と全く同じです。
消したい2階部分、1階天井の範囲となるようにボリュームを調整。

次に[Cull Distances]という項目を調整します。
詳しい調整はUE4 Documentsに載っています。
カリング距離ボリューム (Cull Distance Volume) – UE4 Documentation

よくわからない方はとりあえず「0番目の[Cull Distance]だけ調整すればコントロールできる」くらいに思ってよいと思います。

実験のためひとまず0番目の[Cull Distance]=1にしてみましょう。

ボリューム内が消えました。
「これで十分!」という方はこれで終わりでいいと思います。

1-2.部屋に入ったら表示状態にしたい

ちょっとした応用です。
部屋に近づいたり入ったりしたら表示状態にしたい人向けです。
0番目の[Cull Distance]を部屋のサイズ程度にするだけです。私のデモでは[Cull Distance]=500程度にしました。
すると、ボリューム内のスタティックメッシュのうち、視点からの距離が500以内のメッシュが表示されます。

上空の遠くから見た状態。これだと視点との距離が500以上ですから消えたままです。

部屋に入りました。現在視点位置から距離500のメッシュが表示されています。
例えばこのような設定をすれば、1つのCull Distance Volumeだけで外からみると鳥瞰、中からみると普通に表示となり、トグルのUIが不要になります。

1-3.断面図にしたい場合

外壁などのメッシュに対して同じ設定をすればよいでしょう。

1-4.ボタン等のUIで制御したい

距離ではなくボタンでON/OFFしたいのでしたら、1-1の方法に加え、ブループリントでCull Distance Volumeの[Enable]をtrue/falseする処理を追加すればよいでしょう。

2.マテリアルのオパシティマスクを使う

この方法は例えば「特定のパーツ:床、壁、天井だけ制御したい」という方 向け。私が初めて試したのはこの方法です。家具等は2階のも含めてそのまま表示してほしかったので。

2-1.とにかく鳥瞰図・断面図表現したい

マテリアルエディタで専用のマスク処理を追加、ブループリントクラス1つ、パラメータ1つの作成が必要です。色々作成するのでゴチャゴチャしがちですが1つ1つ頑張りましょう。じっくりやっても5分で終わります。

(1) マテリアルパラメータコレクションを作成
マテリアルパラメータコレクションを新規作成。

スカラー値ベクトル値を作成しましょう。

(2) マテリアルにマスク処理を実装
消したいマテリアルを編集します。例えば外壁などに使用しているサイディングのマテリアルです。
マテリアルエディタを開き、
・[Blend Mode]は[Masked]にしてください。
・次の図のようなノードを付け足して[Opacity Mask]に接続してください。[Make Float 3]ノードはZだけ[1]です。
 ちなみに(X,Y,Z)=(0,0,1)は鳥瞰図で、X、Y方向の断面図は(X,Y,Z)=(1,0,0)や(X,Y,Z)=(0,1,0)のようになります。-1もできます。
 とりあえず「消したい方向を1にして、他は0にする」と覚えてしまえば楽かも。

(3) ブループリントクラスを作成
このまま真似してくださればOK。ブループリントクラスを新規作成します。

このブループリントクラスを開いたら、コンポーネントにStaticMeshを追加します。
追加したStaticMeshの[メッシュ]にPlaneをセットしておきます。

[Construction Sctipt]タブを開いて、以下のようにブループリントを組んでみてください。
やっていることは、先程作ったマテリアルパラメータコレクションのLocation2、Scale2、Normal2に、それぞれブループリントクラスの位置、スケール、法線(Up Vector)の値をセットしてるだけです。(Scaleは今回いらないかな。)

これでOK。できました
作成したブループリントクラスClippingMaskBlueprintをビューポートに配置して、高さ位置を動かしてみましょう。
オパシティマスクを設定したマテリアルだけ(=外壁)が消えるようになりました。

2-2.いろんな角度でクリッピングしたい

こちらも応用編。
(2)マテリアルにマスク処理をちょっと差し替えます。ここでマテリアルパラメータコレクションで作成したNormal2が登場。

作成したブループリントクラスClippingMaskBlueprintを配置して、回転を変更してみてください。
好きな角度にクリッピングできます。

備考

理屈
ブループリントクラスのPlaneの法線の向きと、壁の法線の向きが反対のものを隠そうとしています。
つまり、描画しようとしている場所~クリッピングするブループリントクラス間のベクトルと、ブループリントクラスのベクトルの内積を求めて0~-1(=反対向き)なら消したい。
ところでこの内積の値ってオパシティの「1(表示)と0(非表示)」の値とのルールが偶然同じだから、内積の値をそのままOpacity Maskノードに繋げちゃおうってことです。
ただしマイナス値は全部0にしましょう(=Clamp 0-1)という考慮を忘れずに。

●表示されるとき(内積>0) → Opacity Maskの値 ⇒表示

●表示されないとき(内積<0) → Clampして0 → Opacity Maskの値 ⇒非表示

使用プロジェクト

【CG】Google画像検索だけを頼りに安藤忠雄氏設計の小篠邸をCGで再現する【UE4。BSPブラシのみ】

参考サイト

カリング距離ボリューム (Cull Distance Volume) – UE4 Documentation
・思い出し中…(2-1のマテリアルノードは画像検索で見つけたものを引用し一部改変しています。本記事の内容を試行したのが1年前なので見つけたらリンク貼ります。)

コメントを残す