MAX2AE

一段落したと思ったらすぐに次のお仕事。大忙しっ!

さて、欲しいな〜と思ったけど$250もするんですね、MAX2AE。高すぎってことで、自分で作る準備です。探せばどなたかが公開されてるんでしょうけどね。

まずは基本的なところから位置の取得、例えば15フレーム目のpoint01の位置を知りたければ、

at time 15 in coordsys world $point01.pos

これをスタートからエンドまでループさせれば、ノードのワールド座標は簡単に取得できますね。

for i=animationRange.start to (animationRange.end - animationRange.start) do (
	print ("frame " + (i as string)+ ":" + (at time i in coordsys world $point01.pos) as string)
)

カメラの書き出しですが、AfterEffectsのカメラはターゲット付きなので、maxのフリーカメラを書き出したい場合、カメラのZ方向と「ターゲットまでの距離」を使って適当なターゲット位置を計算します。

if superClassOf selection[1] == camera do
(
	case classOf selection[1] of
	(
		Freecamera:
			(
				td = selection[1].baseObject.targetDistance
				tartgetPos = [selection[1].dir.x * -1 * td + selection[1].pos.x , selection[1].dir.y* -1 * td + selection[1].pos.y, selection[1].dir.z * -1 * td + selection[1].pos.z ]
			)

		Targetcamera:
			(
				tartgetPos = selection[1].target.pos
			)
	)
)

あとはカメラのFOVやロール角を書き出せばOKかな。

ちなみに、レンズフレアエフェクト等の位置参照用に、スクリーン座標を知りたい場合は、

p = selection[1].pos * viewport.getTM()
screen_topLeft = mapScreenToView [0,0] (p.z) [RenderWidth,RenderHeight]
screen_bottomRight = mapScreenToView [RenderWidth,RenderHeight] (p.z) [RenderWidth,RenderHeight]
world_size = screen_topLeft - screen_bottomRight
x_aspect = RenderWidth/(abs world_size.x)
y_aspect = RenderHeight/(abs world_size.y)
screenPos = point2 (x_aspect*(p.x - screen_topLeft.x)) (-(y_aspect*(p.y - screen_topLeft.y)))

です。アクティブビューポートとレンダリングサイズを元にピクセルで結果(screenPos)を取得できます。


htVRMapMerge ver.1.1

イラディアンスマップのマージ。バージョン少しアップです。機能は変わらずで実行に必要な各ファイルが入力されていない時の対処だけです。

ダウンロード:htVRMapMerge11

動作確認はmax9ですからねっ!

あまり使いどころはありませんが、複数選択できるファイルダイアログを.Net オブジェクトで対処してます。スクリプト作成の参考にはなるかも。

使い方。

「#maxroot/ui/macroscript」へコピーし起動したら「ユーザインターフェースのカスタマイズ」です。「CANPLAIZE」カテゴリにあります。

0.) imapviewer.exeのパスを指定(初回のみ)
1.) マージしたい.vrmapをリストに追加(選択ダイアログではCtrlやShiftで複数選択可能です。)
2.) 出力ファイル名を指定

で「Merge」ボタンです。

初期設定を「htVRMapMerge.ini」というファイルへ保存します。場所はユーザ毎のプラグイン設定ディレクトリになります。場所はどこかと言うと、スクリプトリスナーから、

getdir #plugcfg

を実行すると判ります。


htVRMapMerge.ms – merging Irradiance maps

大急ぎで作成です。複数のイラディアンスマップをマージします。実際にはV-Ray付属のimapviewer.exeを起動してマージ処理をさせるだけ、、、

突貫工事で

マクロスクリプトです。「#maxroot/ui/macroscript」へコピーし起動したら「ユーザインターフェースのカスタマイズ」です。「CANPLAIZE」カテゴリにあります。

0.) imapviewer.exeのパスを指定(初回のみ)
1.) マージしたい.vrmapをリストに追加(選択ダイアログではCtrlやShiftで複数選択可能です。)
2.) 出力ファイル名を指定

で「Merge」ボタンです。

エラーのチェック部分を作っていませ~ん。0~2の項目が設定されてなくても「Merge」ボタンは押せちゃいますし実行しようとします。また、imapviewer.exeへのパスは半角スペースが含まれていても動きますが、読み込みするvrmapや書き出すvrmapのパスにスペースがあると動かないんです。ダブルクォーテーションで囲ってみたりしましたけどダメ。

リストボックスに横スクロールがつかないとか、max9環境でつくりました、とか、、、

つまり僕以外にはガラクタですね。お好きにドーゾ、実行も改変も再配布もね。全て自己責任でお願いいたします。

htVRMapMerge.zip

最新版はhtVRMapMerge ver.1.1

初期設定を「htVRMapMerge.ini」というファイルへ保存します。場所は環境によって異なりますが、MAXScriptリスナーで

getdir #plugcfg

を実行すると分かります。


Pre-Render Call back 出来ず

先日のfaceBBox.msをコールバックに登録し、フレームをレンダリングする度にオブジェクトを生成していくようにしたいのですが、コールバックの対象になるイベントはいったいどれなんでしょう?

PreRenderCallBack-malfunction
下のように#preRenderイベントに登録するとレンダリング開始時の一度っきりの実行になります。フレーム毎には実行されません。

callbacks.addscript #preRender fileName:"D:\\faceBBoxForAnim-Pre.ms" id:#BBox

#preRenderFrameはメッシュ評価後に呼び出されるのでそこに新たにオブジェクトを配置しても無視されてレンダリングされないようです。

#preRenderEvalも同じくビューポートには新規のオブジェクト配置をしてくれますがレンダラーには伝わらず、、、

registerTimeCallbackでタイムスライダを動かすたびにコールバックって手もありますが、重くなりますしそもそもスクリプトファイルを登録できないんですね。

分からん、、、
続きを読む “Pre-Render Call back 出来ず”


faceBBox.ms

アイデアのスケッチです。何に使うんだって感じですが、

faceBBox1
メッシュ面毎にバウンディングボックスを生成するとどんな感じになるかと思い、ざっくりスクリプトを組んで見ました。さらにLatticeモディファイヤを適用。

スキャッタ(でしたっけ?)とか、PFlow使っても似たようなことは出来ますね。ボックス自体は姿勢を保つのでアニメーションするオブジェクトに適用すればなんか面白くなるかな。

使い方はオブジェクトを一つ選択して「スクリプトを起動」です。多くても3,000ポリゴン(三角でカウント)くらいのオブジェクトへの適用にとどめておいた方がいいです。max9上でしか試してませんのでお気をつけて。
続きを読む “faceBBox.ms”