0. はじめに
この記事は Houdini Apprentice Advent Calendar 2025 の 18 日目の記事です
0-1. 動作環境
Houdini: 21.0.559 (Production Build)
0-2. 概要
エフェクトをやっているとアニメーションが付いたモデルをもらうことがあると思いますが, プリロールアニメーションが欲しいときってありますよね. (特にオブジェクトトラッキングなど)
手で簡単に付けてしまう方法もありますが毎回やるのは面倒なので, 今回は Houdini の CHOPs を使って自動でプリロールアニメーションを作る方法を書きます.
1. 実装
1-1. トランスフォーム情報の抽出
1-1-1. トランスフォーム行列の計算
Time Shift SOP でアニメーションのスタートフレームでホールドしたものと, ホールドしていないものを用意し, Extract Transform SOP でアニメーションのトランスフォーム行列を計算します.

Extraction Method パラメータは, アニメーションが移動と回転のみなら Translation and Rotation に, それ以外も含むなら内容に合わせて設定すると良いでしょう.
Output Attribute パラメータは Transform Matrix(4x4) に

1-1-2. トランスフォーム行列の変換
以下の VEX で, トランスフォーム行列を XYZ の移動回転(スケール)に変換して, アトリビュートに設定します.
v@translate = {0, 0, 0};
v@rotate = {0, 0, 0};
v@scale = {0, 0, 0};
matrix m = point(0, "transform", 0);
cracktransform(0, 0, {0, 0, 0}, m, v@translate, v@rotate, v@scale);
$cf.$cracktransform VEX function
これにより, トランスフォーム行列と等価な移動回転スケール値を, Detail Attribute として取得することができます.

Detail Wrangle に Vector3 のパラメータを新たに作り, Name をそれぞれ t, r, s としておきます.ラベルはわかりやすいものにします.

追加したパラメータに以下のエクスプレッションを入れ, アトリビュートの値を取得します.


1-2. トランスフォーム情報の外挿
1-2-1. トランスフォーム情報を CHOPs にサンプリングする
chop net を作成し, Channel CHOP を作ります.

t, r, s という名前で Size 3 のチャンネルをそれぞれ作り, value を Detail Wrangle の Translate, Rotate, Scale パラメータをコピーし Paste Relative Reference で参照します. (スケールがないなら s は不要)

Motion FX View を見ると正しく値がサンプリングされていることがわかります.

しかし, デフォルトでは範囲外は境界値でホールドされています.

そこで, 範囲外の値をいい感じに補完します.
Channel CHOP の Channel Range パラメータを Use Start/End にして,Start, End パラメータにアニメーションの存在する尺(ここでは1001〜1060)に,Extend Left パラメータを Slope にします.
尺の後ろ側を広げたい場合は Extend Right パラメータを Slope すると良いでしょう.

Channel CHOP の Units パラメータを Frames に設定します.
Motion FX View を見ると境界値の傾きを維持したまま拡張されていることが分かります.

1-3. トランスフォーム情報の適用
アニメーション開始フレームでホールドした Time Shift SOP に Transform SOP をつなげます.

Export CHOP を Channel CHOP につなげます.
Export Flag(左下の黄色いやつ)をつけます.
Export CHOP の Node パラメータにさっき作った Transform SOP へのパス, Path パラメータには使いたいチャンネルを入力します.

すると Transform SOP のパラメータが自動的に CHOPs の値で上書きされます.(チャンネル名を t, r, s にしたのはこの Transform SOP のパラメータ名と一致させるため)


これにより, 外挿したアニメーションをモデルに適用することができます.
2. トラブルシュート
回転の値によっては、行列の分解時に画像のように不連続な箇所が現れることがあります.

こういう場合には Euler Rotation Filter CHOP を使って修正することができます.


$cf.$Euler Rotation Filter channel node
3. おわりに
今回は CHOPs でのアニメーションの修正をやってみました.
CHOPs はやっぱり便利
