4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Houdini】「キャラに追従させたい!」からなぜかIntrinsic、3D変換行列、内積外積を理解することになったお話

Last updated at Posted at 2025-12-17

環境 : houdini20.5.684

はじめに

Houdini Advent Calendar 2025の18日目の記事です。

ここ最近のhoudiniで一番すっきりしたことを記事にまとめました。
「キャラに追従させたい!」からなぜかIntrinsic、3D変換行列、内積、外積を理解することになったお話です。
では、よろしくおねがいします。

キャラに追従さたい

今までキャラクターに追従さたいときは、

@P +=point(1,"P",アタッチしたいポイント番号);

と書いて位置だけ追従させていました。
しかし、この方法では向き(回転)まで追従させることはできません。
↓ 向きが追従しない
追従しない.gif

↓ やりたいこと
追従する.gif

今回は位置だけではなく向きも追従させたかったため、いろいろ調べてみると、下記のサイトがとても参考になりました。

そのサイトでは複数の追従させる方法が紹介されており、その中でも使い勝手のよかった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」
2025-12-01_23h59_03.png

「y方向に向いたベクトル」と「球の法線」の内積を色にするとこうなる
2025-12-02_00h59_07.png

なぜか最近よく使っています。
シェーダー触っていると、影の処理で内積使います。(光の方向×法線の方向とかで)

外積

2つのベクトルに直交するベクトルを出す。
↓ 2つのベクトルの外積は赤色ベクトルになる
2025-12-02_01h30_52.png

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

「y方向に向いたベクトル」と「球の法線」の外積を赤色ベクトルにするとこうなる
2025-12-02_01h53_14.png

先ほど解説した回転のupやNを決める時に外積を使います。
あと法線を決める時とかにも使います。
そして、外積使う時は毎回迷います。

おわりに

文章を書くのが苦手で、ところどころchatGPTに上手くまとめてもらいました。
参考書を執筆されている方本当にすごいです...

あと、記事の内容が間違っていたらご指摘お願いします。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?