Houdiniかんたんレシピ 10 ~ CopyPointするObjectの移動 ~


~基本的すぎてあまり紹介されない、ちょっと便利なTips紹介~

『Houdiniかんたんレシピ』は、Houdiniを使っていく上で、基本的なことですが基本すぎてチュートリアル等で紹介されないような、ちょっとしたTipsや、ニッチな機能を紹介していくシリーズです。

久しぶりのかんたんレシピ第10回目は、 CopyPointするObjectの移動について紹介します。

 

SOPのCopy to Points SOPやCopy Stamp SOPはObjectを大量にばらまいたり、 パーティクルでObjectを大量に飛ばしたりと非常に強力でよく使うSOPだと思います。

今回はそれらのSOPを使用した時に、それぞれコピーされるObjectの移動回転等を制御する方法を紹介します。これには、 いくつか方法があります。

  1. Copy Stamp SOPのパラメータを使う方法
  2. Copy to Points SOPやCopy Stamp SOPでPoint Attributeを使う方法
  3. Copy Stamp SOPでStamp機能を使う方法

3のCopy Stamp SOPでStamp機能を使う方法は、チュートリアル等で紹介されている時がありますが、単純な移動等には使用しないため、こちらでは紹介しません。

この方法は、より複雑なObjectの変形・アニメーションを伴うものや、トポロジーが変わるようなものの時に使います。

 

1.Copy Stamp SOPのパラメータを使う方法

この方法は、一番手っ取り早く動かす方法で昔から使われてきた方法です。

Copy Stamp SOPのパラメータを直接操作します。

この時の注意点はTransform Cumulativeのチェックを外すことです。

Transform CumulativeのチェックがONになっていると、マルチコピー用に移動量が累積されるようになります。

このパラメータには、Expressionも使えますし、アニメーションも設定できます。

 

2.Copy to Points SOPやCopy Stamp SOPでPoint Attributeを使う方法

1の方法は、Copy Stamp SOPでしか使えません。また、Expressionを使うと複雑な動きの時に重くなってしまいます。

そこで、Point Attributeを使います。これにより、Copy to Points SOPでも制御できるようになり、また移動アトリビュートをVOPやWrangleで計算することでより早く計算することができます。

Copy to Points SOPはコンパイルブロックで処理を早くすることができる利点があります。

またCopy以外にPoint Instance等にも応用することができます。

CopyPointでPoint Attributeを使う方法は、コピー先のPoint(今回ならGrid)にInstancing point attributeを設定します。

いくつかのInstancing point attributeの紹介

  • v@trans  移動量
  • p@orient 方向(クォータニオン)
  • p@rot  回転量orientの後に適用されます(クォータニオン)
  • v@sclae  XYZそれぞれのスケール
  • f@pscale XYZ均一なスケール
  • v@pivot  ピボット
  • 3@transform 3×3Matrixのトランスフォームマトリクス
  • 4@transform 4×4Matrixのトランスフォームマトリクス

これらのPoint AttributeをVOPやWrangleで設定することで移動させることができます。

注意点としては回転アトリビュートはクォータニオンであることです。

Attributeを使用する場合、Copy Stamp SOPの時はTransform Using Template Attribute のチェックをONに、Copy to Points SOPの時はTransform Using Point Orientation のチェックをONにします。

簡単なAttributeの設定例(Wrangle の場合)

例のWrangleのVEXスニペット文は、以下の通りです。

v@rot   = chv("rot"); // XYZの回転角をパラメータで入力する
v@trans = chv("trans"); // XYZの移動量をパラメータで入力する
vector rad; // ラジアンに変換した回転角を収納する変数  
rad = radians(@rot); // 角度をデグリー(0~360)からラジアン(0~2π)に変換 
p@orient = eulertoquaternion(rad, 0); //オイラー角をクォータニオンに変換

※角度をラジアン、クォータニオンに変換することが重要です。

このAttributeを設定したObjectにPoint Instancingすることで、インスタンスオブジェクトを動かすことができます。