feature image

2021年9月6日 | ブログ記事

【Blender】1ポリゴンで(大嘘)ポリゴン2を作る【Vector Displacement】

こんにちは、@d_etteiu8383です。この記事はtraP夏のブログリレー9月6日の記事です。この記事ではBlenderにおけるVector Displacementとその悪用を紹介します(悪用がメインですので前半は飛ばしていただいても構いません)。


突然ですが本日9月6日が何の日だかご存じでしょうか?そうです、つい先日NonSugarとしての初のアルバム『Tasting NonSugar』を発売したことでも有名な真中のんさんの誕生日ですね。

彼女はアニメ『プリパラ』の登場人物の一人ですが、このアニメは3DCGを利用したライブシーンが特徴的ですよね。ということで本記事は3DCGに関するお話です。

ディスプレイスメントとは

3DCGにおけるディスプレイスメント(displacement)とは、(おおざっぱに言うと)モデル表面を変形させる操作・技術のことです。"displace"の意味そのまんま(移す、ずらす)ですね。

ディスプレイスメントの例

具体例を見てみましょう。以下はBlenderにおけるディスプレイスメントの利用例です。本記事では簡単にしか説明しません。詳細は公式のドキュメントを確認してください→Displacement — Blender Manual

説明用に下の画像のようなUV球を用意しました。わかりやすさのために、市松模様の色付けと辺の表示を行っています。

この時点でのマテリアル

早速ディスプレイスメントを利用してみましょう。Blenderにおいてはモディファイア―でのディスプレイスメントと、マテリアルでのディスプレイスメントの2種が利用できますが、今回はマテリアルからのディスプレイスメントを利用します。まず、下記画像のようにマテリアルプロパティの"設定"→"サーフェス"→"ディスプレイスメント"を"ディスプレイスメントのみ"に設定し、ディスプレイスメントを有効化しましょう。ここが"バンプのみ"になっているとディスプレイスメントが反映されません。(参考:Displacement#Displacement Only — Blender Manual)

ディスプレイスメントを利用するための設定

これでマテリアルからディスプレイスメントを扱えるようになりました。早速簡単な例を試してみましょう。

マテリアル出力:ディスプレイスメント

まずマテリアル出力ノードディスプレイスメントに[0.0, 0.0, 0.3]のベクトルを入力として与えてみます。(参考:Material (マテリアル出力)ノード — Blender Manual)(サーフェスに与えている値は無視してください。先述した色の設定をまとめただけです。)

すると、もともとのUV球の位置(画像中オレンジの線)から少し上にずれた位置にUV球がレンダリングされます。

これがディスプレイスメントの最も簡単な例です。与えられたベクトルの値だけ、頂点位置を移動させるのがディスプレイスメントです。この例では、UV球のすべての頂点が[0.0, 0.0, 0.3]だけ移動したので、Z軸方向に(つまり画像の上方向に)UV球が移動したわけです。もし代わりに[0.5, 0.0, 0.0]のベクトルを与えればX軸方向に移動するのもお分かりいただけると思います。

次に、少しだけ発展した例を紹介しましょう。

上図のようにマテリアルを設定すると、UV球の右半分が右上に移動します。各ノードを順に追って仕組みを理解しましょう。ちょっと長いので上のノードツリーを見てやっていることが理解できる方は下まで読み飛ばしていただいて構いません(下までスキップする)。

まず図中一番左のジオメトリノードの"位置"の出力を、XYZ分離ノードの"値"に入力しています。ディスプレイスメントは各頂点に対して行われるものなので、ここでのジオメトリノードの"位置"出力は各頂点の位置を出力していると考えてください(厳密には違うけど言語化が難しい)。XYZ分離ノードはその名の通り、入力として与えられたベクトルのそのX,Y,Zの値を別々のスカラーに分離して出力します。
(参考:Geometry (ジオメトリ)ノード — Blender Manual, Combine/Separate (合成/分離)ノード — Blender Manual)

上図の例では各頂点のX座標を用いたかったので、X座標のみを取り出して次のノードに渡しています。

そのX座標を、"大きい"ノードの"値"の入力に渡しています。これは"値"が"しきい値"よりも大きい場合は1を、それ以外の場合は0を出力するノードです。
(参考:Math (数式)ノード #Greater Than