【Houdini】VEXでバウンディングボックスを基準にグループを作る(ver17.5)

f:id:Effect-Lab:20191024002237p:plain

 

こんにちは。

 

皆さんは下図のような半球のメッシュを作る時、どのように作っていますでしょうか?

f:id:Effect-Lab:20191024004619p:plain

 

エフェクトでよく使う形状ですね。

 

今回は、VEXを使ってスフィアのバウンディングボックスを基準にグループを作成し、そのグループを削除する方法で作ってみたいと思います。

 

この方法で作ると、下図のようにサイズ、分割数、削除する範囲を自由に変える事ができるようになります。

f:id:Effect-Lab:20191026022427g:plain

 

つくりかた

ノード構成

 まず、ノード構成はこのようになっています。

f:id:Effect-Lab:20191024005244p:plain


非常にシンプル。

 

 

VEX全文

VEXの全文はこのようになっています。

f:id:Effect-Lab:20191024005432p:plain

  

順番に見ていきましょう。

 

 

スフィアのバウンディングボックスを取得する 

1行目では、「relbbox」という関数を使って、スフィアのバウンディングボックスを0~1の範囲で取得し、「bbox」という変数に代入しています。

vector bbox = relbbox(0, @P);

 

 

グループ範囲を決めるしきい値をつくる

2行目はどこを堺にグループに含むかのしきい値用の変数を作っています。

float threshold = chf("threshold");

 

しきい値は調整可能にしたいので、chf関数を使って下図のように外に出しておきます。

f:id:Effect-Lab:20191024221621p:plain



if文でグループに含む条件を設定する

3行目はif文を使い、グループに含めるポイントの条件を設定しています。
スフィアの正面を+Zとしてその背面を削除したいので、「bbox.z」と記述してスフィアのバウンディングボックスのZ方向0~1の範囲だけ参照します。
そして「< hreshold」と記述して、しきい値より小さい場合はグループに含めるとします。

if(bbox.z < threshold)
{
  i@group_BackFace = 1;
}

 

 VEXでグループを作る際、アトリビュートを作るのと似たような感じで「i@group_自由な名前」でグループを作る事ができます。
グループに含むか含まないかは0か1かで判断されるので、含みたい場合は「1」を、含みたくない場合は「0」というif文を書く事でグループがつくれます。

 

ですので、条件に含まない場合は「0」という処理を最後に書きます。

else
{
  i@group_BackFace = 0;

 

これで下図のようにスフィアの背面をグループ化する事ができました!

f:id:Effect-Lab:20191026134046g:plain

 

 

グループ化されたポイントをハイライトする方法

添付の画像ではグループ化されたポイントが黄色くハイライトされていますね。
グループ範囲は可視化しておいた方が制作しやすいのでしておきましょう。

「Bindings」タブの「Output Selection Group」にグループ名を記入すればハイライトされるようになります。

f:id:Effect-Lab:20191026213302p:plain


 

グループ化されたポイントを削除 

最後にこのグループを「Delete」ノードで削除して完成です!

f:id:Effect-Lab:20191026181609p:plain

 

 

Houdini本 販売中!

Houdiniでエフェクト用メッシュをさくさく作れるようになるチュートリアル本を販売中です!

エフェクトでよく使う4つの形状を例に、Houdini初心者のために分かりやすく丁寧に解説していますので、ぜひ覗いてみてください!