4
1

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でAfterEffectsのキーフレームを作る

Posted at

はじめに

概要

この記事はHoudini Apprenticeアドベントカレンダー2025 20日目の記事です。

AfterEffectsでコンポジットしながら、3D素材のトラッキングしたいなぁ見たいな時ってありますよね。
Particulerのソースポイント作ったり、マスク用のNullを作ったり、色取得用のサンプリングポイントで使ったり...
ちなみに自分は月に5回ぐらいあります。
よくnullノードとして3Dで書き出すツールとかはあるのですが、カメラとヌルを出力してAEで組み立ててみたいなことになるとちょっと複雑で2D素材に適用するには不便なので、2Dトラッキング的に使用する方法です。

環境

Houdini20.5.487 py3.11
前提としてAlembicなりでCameraとトラッキングするジオメトリを用意します。

Houdini側のノード

ノード全体は簡潔で、特に捻ったことはしていません。
image.png
まずはトラッキングするポイントを指定します。
今回は説明のために適当なポイントをBlastしてますが、ちょうどいい点が無い場合は適当なポイントをxyzdistuvprimとかで追従させると良いでしょう。

toNDC_posのWrangleは少し難しいかもしれないです。
image.png

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で指定フレームのポイントの軌跡を全てまとめます。
image.png
この方法を使用すると指定したフレームから見て過去のポイントを取得しているため、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で値を引っこ抜きます。
GS_test.gif
あとはChatGPTなりGeminiなりに投げます。
image.png
あとは適当な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は映像制作だけでなくそれらのデータも活用できる面白いソフトです。
何かしら面白いと思っていただけますと幸いです。
それでは、しゃーした~。

4
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?