No More Retake

3DCG屋さん向けTips&Referenceサイト

メニュー

Houdini:VOPを使ってVolume Deform

Advent Calendarの17日目に参加です。

ボリュームを捻じ曲げる方法です。
H19で追加されたVolume Deformer(SOP)を使わない、VOPを使った方法です。
そのうち書こうと思ってたらHoudiniの進化で過去の遺物になってしまったかもしれないネタ。

Volumeを変形させる方法はいろいろありますが、ここでは私が良く使うVolume Sample(VOP)を用いた方法をシンプルな例を用いて紹介します。

SampleFile・・・VolumeDeformSample.hiplc
使用バージョンはHoudini19.0431

VOPで煙を捻じる

こんな感じの煙を用意します。

シェルフのBillowy SmokeからWindを切って真上に煙が昇るだけのシンプルなものです。
これをVOPを使って捻じります。
ネットワークはこんな感じ。

ネットワークを見やすくするために、Billowy Smoke部分はSubNet化しています。
VolumeVOPノードの中で捻じる処理をしています。中身はこんな感じ。

この中で一番大事なノードは、右のほうにあるVolume Sample(VOP)です。

Volume Sample(VOP)の機能を一言でいうと、”指定した場所のボクセル情報を取得する”、です。
これを使って、本来のボクセル位置とは違うところにあるボクセル情報を取得することが出来ます。
「ホントはここにあるんだけ、あっちのボクセルからDensity情報を取ってきちゃおう」、ってことです。
イメージとしてはこんな感じ。伝わるかな?

VolumeVOPはすべてのボクセルに対して、内部の計算が適用されます。
上イメージをすべてのボクセルでやってる感じです。
なので、ボクセル毎に少しずつ捻った場所の位置情報を指定してあげれば、Volume Sample(VOP)が指定先の情報を取得してくれ、結果として煙全体を捻じることができるというわけです。
その処理をやってたのが、先に載せたVOPの中身です。
これを踏まえてVOPネットワークを見ていきましょう。

  1. Vector to Float(VOP)を使ってPositionからY情報だけ取り出す(Y方向を軸にして捻じるため)
  2. Y情報をFit Range(VOP)で0~1の範囲にRemap。最大値最小値が捻じる高さの範囲になる。
  3. Ramp Parameter(VOP)で再度Remap。好きに調整。
  4. 0~1の値を角度(360度のあれ)に変換します。人間が調整しやすいようにです。
  5. 実際の回転計算には弧度法(ラジアン)を使うので、Degrees to Radians(VOP)で変換します。
  6. Rotate(VOP)を使って回転用のMatrixを作ります。angle(角度)にこれまで作った値を、axis(軸)はY方向を指定してます。
  7. Multiply(VOP)を使ってPositionの値と⑥のMatrix情報を掛け算すると⑥情報の分だけ回転した、新しいPosition情報が生成されます。
  8. Volume Sample(VOP)の入力sampleposに⑦の結果を繋ぎ、パラメータを設定しDensityを参照すれば、捻じった先のボクセルにあるDensity値が取得できる。
  9. これをVolume VOP Output(VOP)のdensity出力につなぐことで、自身のボクセルのdensity値が別のボクセルので置き換わる。

これで捻じりの処理は完成です。

まだ解説してないノードがひとつあります。Volume VOP(SOP)ノードの上につないである、VDB Active(SOP)です。

VDB Active(SOP)

これは何のために使っているかというと、Volumeの領域を広げるために使っています。
ワイヤーフレーム表示にしてみると、ボリュームの枠が広がっていることが確認できます。

VDB Active(SOP)にあるExpandの機能を使って領域を拡張しています。
なぜこんなことをしているのかというと、変形先が元のボクセル領域からはみ出てしまうような場合、そこで切れてしまうからです。
上記の煙のサンプルだと、VDB Active(SOP)のON/OFFでこんな感じに。

左がそのまま変形させたもの、右がVDB Active(SOP)で領域を広げたものです。
左の方は、煙の出始めにブロック状の部分が散見されます。
参照先にボクセルが存在しない場合、そこが欠損してしまうのです。変形が大きくなるほど、領域を広げないと欠損が起きやすいです。

なのでVolumeを変形する際は、元よりも領域を少し広げておくのが鉄則です。

注意点

注意点があります。

注意点その1

上記のサンプルで曲げているのはあくまでDensity情報だけで他のVolume情報はそのままです。
VelocityとかTemperatureとか曲がっていません。
レンダリングとかで使いたい場合は、それらも同様の方法で曲げる必要があります。
めんどくさいですね。
実はVolume Sample(VOP)はスカラー値の情報のみを取得できるノードで、Velocity等のベクタ値の場合は、Volume Sample Vector(VOP)という別のノードを使う必要があります。扱うデータの型によって使い分けます。

また当然ですが、ボクセルを扱うため変形しすぎると解像度の粗が見えてきます。
後処理で誤魔化すのにも限界があるので、この点も注意が必要ですね。

注意点その2

これは私の理解が足りてないので説明できないのですが、紹介した方法でこんな感じに横に曲げていくと真横以上には曲がらなくなって反対側からニョキっと出てきてしまうんです。なぜだろう。
分かる方いたら教えて欲しいです。

他の方法

他にもVolumeの変形方法はいろいろあります。

その1

例えば、参照先の情報をあらかじめSOP上のポイントに逃がしておいて、それをVolume Sample(VOP)が参照する方法。上記例の①~⑦をSOPでポイントを使ってやってしまおうと、そういう方法です。ポイントのアトリビュートに変形前(変形後かも)の情報をRestとかで持たせといて、それをもとにVOPで変形という手順です。
その方法ならば変形処理はSOPで行うことが可能で、Lattice的な処理も割と楽に出来ますね。
数少ないHoudiniの書籍、”Houdiniではじめる3Dビジュアルエフェクト (I・O BOOKS) “にて紹介されているのもこの方法だったかと記憶しています。(違ったかな?)

その2

一旦ポイントに情報を逃がして、変形後にポイントをVolumeにラスタライズする方法。
cgwiki先生のところで紹介されているのはこの方法かな。
https://www.tokeru.com/cgwiki/index.php?title=HoudiniVolumes#Volume_deform

その3

他にはCGWorldで連載されているHoudini Cook Bookにて紹介されている方法は、VolumeSample(VOP)を使っていますが、ボリュームにノイズ的な変形を加えるという使い方をされていますね。
https://cgworld.jp/regular/201905-hcb-098.html

実際はこういう用途の方が使用頻度としては多いのかも。
ここで紹介されているVolume Gradient(SOP)も、Volume Sample(VOP)同様よく使う便利なノードなので、未履修の方は見てみると後々役に立つかも。

Volume Deform(SOP)

最後にHoudini19で追加されたVolume Deform(SOP)。
VOPとか手法とか注意点とか気にせずにポチポチやってれば、Volumeを変形してくれる便利なノード。

これまでVolume Deformについて云々かんぬん書いてきましたが、正直これ使っとけば万事OKな気がします。
Volumeを変形させたいがために、幾多のフォーラムを渡り歩き、頭を抱えた日々が懐かしい。
それらの努力や工夫が進歩になぎ倒されて行くのはいつものこと。
Houdiniは知識の潰しが効くソフトです。
ここで紹介した方法が何らかの形で助けになってくれる日が来るかもしれない。
長々と書いてしまいましたが、ここまで読んでくれたあなたにそんな日が訪れますように。

以上!
ではまた。

関連記事

コメントをお待ちしております

このサイトについて

3DCG Tipsサイト。Houdiniの記事が多めです。

RSS

follow us in feedly

Archives

  • 2024 (4)
  • 2023 (2)
  • 2022 (9)
  • 2021 (14)
  • 2020 (46)
  • 2019 (17)
  • 2018 (33)
  • 2017 (29)
  • 2016 (36)
  • 2015 (64)
  • 2014 (54)
  • 2013 (60)
  • 2012 (55)

スポンサードリンク

言語切り替え

  • English (United States)
  • 日本語

スポンサードリンク

言語切り替え

  • English (United States)
  • 日本語

Houdiniを使えるようになる本