はじめに
概要
この記事はHoudini Apprenticeアドベントカレンダー2025 20日目の記事です。
AfterEffectsでコンポジットしながら、3D素材のトラッキングしたいなぁ見たいな時ってありますよね。
Particulerのソースポイント作ったり、マスク用のNullを作ったり、色取得用のサンプリングポイントで使ったり...
ちなみに自分は月に5回ぐらいあります。
よくnullノードとして3Dで書き出すツールとかはあるのですが、カメラとヌルを出力してAEで組み立ててみたいなことになるとちょっと複雑で2D素材に適用するには不便なので、2Dトラッキング的に使用する方法です。
環境
Houdini20.5.487 py3.11
前提としてAlembicなりでCameraとトラッキングするジオメトリを用意します。
Houdini側のノード
ノード全体は簡潔で、特に捻ったことはしていません。

まずはトラッキングするポイントを指定します。
今回は説明のために適当なポイントをBlastしてますが、ちょうどいい点が無い場合は適当なポイントをxyzdistとuvprimとかで追従させると良いでしょう。
toNDC_posのWrangleは少し難しいかもしれないです。

string cam = chsop("camera");
vector ndc_pos = toNDC(cam, @P);
ndc_pos.y = 1 - ndc_pos.y;
ndc_pos.z = 0;
v@tracking_pos = ndc_pos*chv("cam_size");
toNDC関数を使用してカメラから見た座標に変換します。
この関数は左下を原点にしてカメラ全体を0-1の範囲で返す関数です。
通常のUVみたいに使うにはこれでいいですが、AfterEffectsの原点は左上なので範囲を反転させたうえで、カメラのサイズにスケールします。
ちなみにカメラのサイズの取得はch(chsop("camera") + "/resx")こんな感じのExpressionを使用すると自動で取得できるので便利です。
これでカメラから見た2Dポジションの取得が完了しました。
次にTrail+TimeShiftで指定フレームのポイントの軌跡を全てまとめます。

この方法を使用すると指定したフレームから見て過去のポイントを取得しているため、1F目が一番古いポイントになっているため、SortSOPでポイント番号を反転させておきます。
これでトラッキングに必要な位置情報が全て取得できました。
AfterEffectsのキーフレーム情報に変換する
そもそもAEのキーフレーム情報はこのように文字列で管理することが出来ます。
Adobe After Effects 9.0 Keyframe Data
Units Per Second 24
Source Width 1920
Source Height 1080
Source Pixel Aspect Ratio 1
Comp Pixel Aspect Ratio 1
Layer
Transform Position
Frame X pixels Y pixels Z pixels
0 1072.4 498.1 0
1 1072.3 498.1 0
2 1071.8 498.3 0
3 1071 498.6 0
End of Keyframe Data
なのでこのフォーマットに沿ってデータを変形させればすぐに使用可能です。
ちなみに上の情報は今回はそこまで重要ではないので、下のフレームと位置情報だけ揃えれば使用可能です。
手抜きの方法
位置情報を数値データとして使用するのでGeometry SpreadSheetを開きます。そしてドラックしてCtrl+Cで値を引っこ抜きます。

あとはChatGPTなりGeminiなりに投げます。

あとは適当なNullを作ってこれをコピペするとトラッキングの完了です。
ちゃんとやる
流石にこの方法だけ紹介するとあれなのでPythonを使用して取得する方法です。
アトリビュートパラメータに参照したいアトリビュート名を記入して使用します。
import hou
node = hou.pwd()
geo = node.geometry()
attrib = geo.findPointAttrib(node.evalParm("attrib"))
lines = [
"Adobe After Effects 9.0 Keyframe Data",
"",
"\tUnits Per Second\t24",
"\tSource Width\t100",
"\tSource Height\t100",
"\tSource Pixel Aspect Ratio\t1",
"\tComp Pixel Aspect Ratio\t1",
"",
"Layer",
"Transform\tPosition",
"\tFrame\tX pixels\tY pixels\tZ pixels\t",
]
lines += [
"\t{}\t{:.1f}\t{:.1f}\t{:.1f}\t".format(i, *p.attribValue(attrib))
for i, p in enumerate(geo.points())
]
lines += ["", "End of Keyframe Data"]
hou.ui.copyTextToClipboard("\n".join(lines))
hou.ui.displayMessage(
"AE Keyframe Data をクリップボードにコピーしました。\n"
"フレーム数: {}\n"
"Attrib: {}".format(len(geo.points()), attrib.name()),
title="Export Complete"
)
これを実行するとクリップボードにキーフレーム情報がコピーされるので、それを張り付ければ完了です。
ちなみにこの手の任意のタイミングでPythonを実行したい場合はこちらのサイトのように実行ボタンを付けると便利です。Houdini:Python(SOP)に実行ボタン
おわりに
この方法を使用すると画面外のトラッキング情報も正しく取得できるので何かと重宝しています。
Houdiniは映像制作だけでなくそれらのデータも活用できる面白いソフトです。
何かしら面白いと思っていただけますと幸いです。
それでは、しゃーした~。