株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • Graphinica Talk [by 吉岡宏夫氏]

Graphinica Talk [by 吉岡宏夫氏]

2014/3/1

Tag: ,,,

こんにちはー。開発室のひらく[@horonig]です。
今回の記事はDF_talk史上初の試み!外部の方による執筆になります。

記念すべき第一回目は、Graphinica吉岡宏夫さんです!!
(ちなみに、この先もこの【外部執筆シリーズ】が続くかは未定ですw)

AfterEffectsで有名な吉岡さんに、まさか記事を書いて頂けるとは・・。
正直、畏れ多くて失禁しそうですw

では、はりきってまいりましょー!!

↓↓↓↓↓↓↓↓↓↓


 
こんにちは。Graphinicaの吉岡です。

ひょんな事から、DF_talkの記事を書くことになってしまいました(笑)
どうぞ宜しくお願いします。

では始めましょう。

 
とある作品の1パート分のコンポジットをまるっとヘルプしたときの物語。

1パートまるまるライブシーン。尺は曲1曲分。だいたい5分くらい?
ステージのライトなどをAEで効果つけするということだが、3Dの連番画像は素材として来ているものの
ライトの素材はオブジェクトIDのパスとして書きだされている模様。
このパスの輝度情報等を頼りにOpticalFlaresで効果を足すのもいいが遠近等による大きさの考慮
などからライトレイヤーを仕込んでOpticalFlaresでTrackLightしたほうが良いかも。
スポットライトのビーム表現もLuxをつかえばそれっぽくできるし、ライト位置は変わらないので
ライト情報総ライトレイヤー化計画。

カメラワークは付いているのでまずはカメラの情報が必要。
幸い連番はrpfフォーマットになっており、カメラ情報は付随してくるようだが、rpfフォーマットは
画角を取ってくれないので毎回画角調整しなくてはならない。
合わせられなくもないが合わせるのがしんどいし、量もあるのでここは新機能の提案。

というこでやったことないけど、ステートセットのコンポジタリンクを提案してみる。

すでにプリビズ的なのは終わっている模様でボチボチとレンダリングされた素材を
もらっている最中だったり、ライトレイヤー化するライトの選別などもあり、
ステートセットのセッティングをこちらでやることに。

全ショットのステージのシーンをまるっともらって確認。
カメラはそのまま使うとして、まずはライトをセット。
全ショットのライト位置は変わらないので、ライトを先に吐き出しておけば
あとはカメラだけ持ってくれば合うという作戦。

こちらの環境は3dsMAX2014、AfterEffectsCS6

今回、実際のファイルは使えないのでサンプルを作成。

適当にステージ作成。
モデリングは適当にモデモデ。
背景はnordicfx.netから拝借したHDRでIBL+GIで簡単にでっち上げ
http://www.nordicfx.net/?portfolio=hdri-003-parking-lot

一応同じ状態にするために、この地点でMAX上でカメラワークを付けてレンダリングしておく。
トラスやライトにIDを振って、rpf形式で情報を付随させてレンダー。

この画にAEでライトの光を足すということで、MAXのシーンにライト配置

今回はレンズ部をモデリングしたのでオムニライトをクイック位置合わせで簡単配置

 
Maxから、レンダリングメニュー>ステートセット…
を選択するとステートセットのウィンドウが開く

 
使い方としては、AEに持って行きたいオブジェクトを選択して
ステートセットのオブジェクトの◎(記録ボタン)をクリック。
ノードプロパティの変更のところに持っていくオブジェクト一覧ができる
標準プリミティブの平面は平面レイヤーとして持ってこれる。
その他プリミティブなどは基点位置を基準に点みたいなヌルレイヤーができる
スポットライトはスポットライトとして読み込める。
オムニライトはポイントライトになる。

今回は先にレンダリングされた画像があるのでカメラとライトだけチェックしておく

こんな感じ

このsofファイルをAEで読み込む。

 
読み込みプラグインがAECS6にはデフォルトでインストールされていなかったので
以下からインストール

C:\Program Files\Autodesk\3ds Max 2014\ExternalPlugins\CS5\Windows
にある
Adobe.AfterFX.dll
Autodesk.Plugins.Adobe.AfterFX.SceneIO.dll
Autodesk.Plugins.Adobe.AfterFX.SceneIO.Loader.aex

上記2つのDLLは
C:\Program Files\Adobe\Adobe After Effects CS6\Support Files
直下にコピー
aexファイルは
C:\Program Files\Adobe\Adobe After Effects CS6\Support Files/Plug-ins
フォルダにコピー

AEを再起動してファイルメニュー>Open Compositor Link (Autodesk)…
を選ぶとこんなウィンドウがでる。

 
Create Linkをクリックすると、コンポジタリンクのファイルを指定する
ダイアログが出てくるので、ファイルを指定。

AEにコンポがない場合は新規で作成される
コンポがある場合はフッテージウィンドウの先頭のコンポにリンクされるので注意。

さらにチェックボックスによってリンクするものを選択することができるが
問答無用でコンポサイズ、フレームレート、コンポの開始時間がMAXのシーンと同じに
なるので注意。

 
リンク作成後は本来MAXとAEを行き来できる機能なので、更新情報をAEからMAXに伝えたり
MAXからAEに伝えたりするために、リンクのボタンが「リンクから更新」や「リンクに更新」に
変化するので注意。

さてここで、やっぱりというか実作業ではテストもなしでやったせいか問題発生。
絵のタイミングと合わないフレームがあることが発覚。
キーフレームの位置は問題ないように思えるが、キーフレームに移動しても値が変わらない箇所が幾つか判明。

ずれる

キーフレームの見た目は合っているように見えるが、冷静に考えるとそれはただの見た目。
キーフレームの時間位置はプロジェクト設定の時間の表示形式にかかわらず、秒で表すのでこれを確認してみる。
そのまま時間の値を得てもパッと見わかりにくいのでこれをフレームに変換してみる。

フレーム番号を得たい時は、
秒*フレームレート(開始フレームが0の場合)
[object Property].keyTime(keyIndex) * thisComp.frameRate
で表されるので、フレームにピッタリの位置であれば整数となるはず。

位置プロパティのキーフレーム時間を調べてみると

誤差発覚。これが微妙な誤差で、見た目上そのフレームにキーが打たれているように見えて
ちょっとずれてたというオチ。
26フレームにあるはずのキーフレームは26フレームよりちょっと先にあるので25のフレームを
拾ってきてしまう。

ってことは四捨五入して秒にもどした値でキーを打ち直せばいいということで、そのスクリプトを適当にカキカキ


(function(){

    function adjustValueTime(prop, fps){
        var num = prop.numKeys;
        for(var i=1;i<=num;i++){
            var dstValue = prop.keyValue(i);
            var adjustTime = Math.round(prop.keyTime(i)*fps)/fps;
            prop.removeKey(i);
            prop.setValueAtTime(adjustTime, dstValue);
        }
    }

    if(app.project.activeItem){

        var cam = app.project.activeItem.selectedLayers[0];
        if(cam){

            app.beginUndoGroup('adjustKeyTime');

            var baseFrameRate = app.project.activeItem.frameRate;
            var baseProp = cam.property('ADBE Transform Group');

            adjustValueTime(baseProp('ADBE Anchor Point'), baseFrameRate);
            adjustValueTime(baseProp('ADBE Position'), baseFrameRate);
            adjustValueTime(baseProp('ADBE Rotate Z'), baseFrameRate);

            app.endUndoGroup();
        }
    }

}());

 

app.project.activeItem.selectedLayers[0];

は今アクティブなコンポで選択したレイヤーの1個めということ。

 
プロパティはちょっと丁寧に書いているが、もうちょっと略式もあるのでそれは任意に。

var baseProp = cam.property('ADBE Transform Group');

baseProp('ADBE Position')

cam.position;

と等価。


うまくいった。

コンポジタリンクではアニメーションしていないとこにも1つだけキーフレームがついたりするので
そういった部分も削除するルーチンも入れておくといいかも。

このサンプルではキーフレームの値を確保しておき、削除した後、修正した時間にキーフレーム配置を
チマチマ繰り返しているが、配列にしてまとめてガツッと打てる関数もあるので使いわけすると便利。

値を見てもOKOK

今回のサンプルではうまくいかないサンプルを作ってみたわけだが、最初作ったときはズレたりしなかったので
さらに検証する必要がでてきた。
いろいろ調べて見た結果、シーンの開始時間に問題があることがわかり、どうやらMaxのシーンの時間位置が
10秒を超えるところから誤差が発生していることが判明。

試しに24fpsの2500フレームあるサンプルを作成して調べてみると。

見事に10秒後からずれてる!

30fpsなら3000以降からずれる。

実は今回それぞれのショットのシーンの開始フレームが
0や1等の開始ではなく、パート全体の通しフレームから割り振られていたため
パート全体の10秒後のシーンからこの現象が発生したことになる。

 
サンプルでは26フレーム目がなどと書いているが、実はMAXのシーンの開始時間を3000とかに
してあって、AEにリンクした後にコンポジション設定の開始時間をいつも通りの1に変えてあるので
ずれを再現できている。

 
まとめ

●開始フレームを0や1にすることでとりあえず誤差発生の可能性を減らすことができる。
●シーンの尺が10秒超えると誤差が発生するのでその場合はAEのスクリプトで対応。
●どのみちいらないキーフレームも打たれるのでAEのスクリプトは書いたほうが良い。
●コンポの大きさとシーンの出力の大きさを同じにする必要があるので計画的に。

 
 
でけた
ライトの影響をつけていないが、その場合は法線などを使う必要が出てくるかも。

 
ということでステートセットに助けられたんだか苦しめられたんだかよくわからない案件だった。
とはいえこれでピッタリ合うので便利かもね。

 
実作業ではもうちょい時間あるとか、前段階から準備しておけばElement3Dを加味して
いろいろできたかも。

Element3D簡単に使ってみるとこんな感じに

ではでは。
 


 
とまぁ素晴らしい記事を書いて頂きました。
DF_talkには3ds maxの記事が少ないので、そこがまた貴重ですね。

この【外部執筆シリーズ】ですが、機会があれば是非、第二回、第三回と続けていきたいところです。
「俺も記事書きたい!」という希少な方がいらっしゃいましたら、いつでもひらく[@horonig]までご連絡下さいw

吉岡さん、本当にありがとうございました!!

 
※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

CAPTCHA


 

*