環境 : houdini20.5.684
はじめに
Houdini Advent Calendar 2025の18日目の記事です。
ここ最近のhoudiniで一番すっきりしたことを記事にまとめました。
「キャラに追従させたい!」からなぜかIntrinsic、3D変換行列、内積、外積を理解することになったお話です。
では、よろしくおねがいします。
キャラに追従さたい
今までキャラクターに追従さたいときは、
@P +=point(1,"P",アタッチしたいポイント番号);
と書いて位置だけ追従させていました。
しかし、この方法では向き(回転)まで追従させることはできません。
↓ 向きが追従しない

今回は位置だけではなく向きも追従させたかったため、いろいろ調べてみると、下記のサイトがとても参考になりました。
そのサイトでは複数の追従させる方法が紹介されており、その中でも使い勝手のよかったpackedfulltransformを使用して追従させることにしました。
packedfulltransformを選んだ理由
今回追従させたいキャラクターデータがMayaで作られたものであり、かつ、追従させたい所にポイント(頂点)がありませんでした。そこで、サイトで紹介されているように「Mayaでロケーターを作成し、そのロケーターの位置と回転をHoudiniに持ち込んでpackedfulltransformを適用する」という方法を選びました。
Intrinsicとは
packedfulltransformを使用して無事キャラクターに追従させることはできたのですが、「packedfulltransformとはなんぞや」という疑問が残りました。
そこでいろいろ調べてみると、下記の記事がとても参考になりました。
翻訳サイト等で"Intrinsic"の意味を調べてみると
本来備わっている, 固有の, 本質的な,
といった意味だと。つまり
カスタムアトリビュートとは違い、ユーザーが定義して付与されるものではなく
ノード(primitive, detail)がクックされた次点で自然に持っている情報がIntrinsicアトリビュートということになります。boundの値やpirimitive内にいくつvertexを持っているか、
メモリをどれくらい使用しているか、といった値を持っていたりします。
要するに、packedfulltransformとはintrinsicデータの一つで、内部データみたいなもの。
そして、VEXを下記のように記述することでintrinsicデータを取り出すことができるようです。
primintrinsic(0,"packedfulltransform",0);
primintrinsic VEX function のヘルプ
https://www.sidefx.com/ja/docs/houdini/vex/functions/primintrinsic.html
3D変換行列とは
「packedfulltransformとはintrinsicデータの一つ」というのはわかったのですが、結局、「packedfulltransformってなに?」となりました。
試しにpackedfulltransformの値を取り出してみると、4×4のmatrix(行列)データで構成されてることがわかった。
そこで、「transform」「matrix」というキーワードでいろいろと調べてみると、以下の記事がとても参考になりました。
要するに、回転は難しい。
.....じゃなくて、
要するに、packedfulltransformは「位置」「スケール」「回転」を4×4のmatrix(行列)で表した トランスフォームのアトリビュート らしい。(詳しい内容は上記の記事にまとめられています)
たった4×4の数字で「位置」「スケール」「回転」をすべて表現できるのスゴイ。
回転
3D変換行列を理解することで、なんとなく使っていたupとNの理解が深まりました。
これまで「回転を決めるだけなのに、なぜupとNの2つの方向を指定しないといけないのか」という疑問がありましたが、実際には、 オブジェクトの向きを決めるには “3つの方向(軸)” を決める必要がある ため、2つのベクトルを指定するのは当然のことでした。
Houdini ではこのとき、
up = 上方向
N = 前方向
として扱われ、
残りの横方向は、この2つのベクトルから自動的に計算されて補完されてるようです。(横を90度に設定)
つまり、up と N を決めることで、最終的な3軸すべてが決まり、オブジェクトの向き(回転)が確定するという仕組みになっていました。
内積・外積
以上、疑問に思っていたことは解決しました、が、
上記の記事(3D変換行列の解説)に出てくる 「外積」 の説明を見て、「そういえば外積ってなんだっけ?」となったため、ついでに「内積」と「外積」について調べ直すことにしました。
内積
2つのベクトルの向きがどれくらいそろっているかを「-1~1」の範囲で出す。
向きが同じであれば「1」向きが反対であれば「-1」

「y方向に向いたベクトル」と「球の法線」の内積を色にするとこうなる

なぜか最近よく使っています。
シェーダー触っていると、影の処理で内積使います。(光の方向×法線の方向とかで)
外積
2つのベクトルに直交するベクトルを出す。
↓ 2つのベクトルの外積は赤色ベクトルになる

↓ ベクトルの計算順番によって外積の結果が反対になる。(A×B)か(B×A)で±が変わる

「y方向に向いたベクトル」と「球の法線」の外積を赤色ベクトルにするとこうなる

先ほど解説した回転のupやNを決める時に外積を使います。
あと法線を決める時とかにも使います。
そして、外積使う時は毎回迷います。
おわりに
文章を書くのが苦手で、ところどころchatGPTに上手くまとめてもらいました。
参考書を執筆されている方本当にすごいです...
あと、記事の内容が間違っていたらご指摘お願いします。
