« C4D 新たに、ポリゴンオブジェクトを一体化するスクリプトを作ってみよう。 | トップページ | C4DのC.O.F.F.E.E.で「ヘロンの公式」を使って、ポリゴンの面積を求めてみる »

StudioMOMO「C.O.F.F.E.E.でバッチレンダリング」…

C4Dの「レンダリング」メニューの「バッチレンダリング...」をCallCommand()で呼ぶと、既にファイルパスが設定された常態ね…

正直、自分にもわかりません…

SDKは一通り目を通したつもりなのですが、最近の自分の目は節穴なので見落としているかもしれません…

シーンファイルやオブジェクトに働きかけるものではなく、C4Dに直接働きかけるので、有るとしたらBasicFunction辺りの項目になるのでしょう。

バッチレンダリングの設定値は、設定後にバッチレンダリングを閉じても残っていますが、C4Dを再起動すると消えてしまうのだ。
C4Dの設定ファイルにも絡んでいないようです。

もし、設定ファイルに記録されているならば…
GetWorldContainer()とSetWorldContainer()で設定値が格納されているコンテナの取得/適用ができます。
このコンテナに格納されているデータは、C4Dの「編集」メニューの「一般設定...」の項目なので、バッチレンダリングには関係ないんですけどね。

CallCommand()はコマンドを呼び出す為だけのものなのです。
SendModelingCommand()のように設定値を渡してコマンドを呼び出せれば良いのですが…
残念ながらバッチレンダリングはモデリングコマンドではありません。

では、バッチレンダリング[CallCommand(100038)]を諦めて、バッチレンダリングその物をC.O.F.F.E.E.で作れないだろうか?

バッチレンダリング機能をC.O.F.F.E.E.で、できないか考えてみる。

そうすると「バッチレンダリング...」ではなく「レンダリング後に保存」[CallCommand(12099)]を使ってみたらどうだろう?

レンダリングするシーンファイルを全て読み込んだ後に、次のようなスクリプトを実行する。
ただしイメージなので、本当に実行しないでください。

//イメージなのでコピペして実行しないでください。

var rend_doc = GetFirstDocument();  //C4Dで複数開いている最初のシーンファイルの取得

while(rend_doc){
  CallCommand(12099); //レンダリング後に保存
  rend_doc = rend_doc->GetNext();  //次のドキュメントを取得
}

この様に組み立てたら、何となくできそうな気分になってきますが…

次のエラーが出ます。

Batchrendering_02

「レンダリング後に保存」は、実行すると「画像表示」ウィンドウが出てレンダリングの様子が表示されます。
レンダリング中にウィンドウを閉じようとしたり、別のシーンをレンダリングしようとすると、この様なダイアログが表示されます。

上のコードは、レンダリング中に次のシーンをレンダリングしようとしているのです。
もし、これを解決させるのであれば、ループの終わりに、次のような処理を入れます。

「C4Dがレンダリング中か?レンダリング中なら待機」

whiel(C4Dがレンダリング中);

これで、レンダリング中なら無限ループになり、レンダリングが終了したらループから脱出します。

ここまで来たら、もう結果は想像が付くと思います。

「C4Dがレンダリング中」か?

C4Dの状態を取得できれば良いのだ…state
もしくは、レンダリング中フラグが立っていれば、bitか?
それとも、レンダリング中/レンダリング終了って伝えてくれる、eventか?

このキーワードを携えて、SDKの中を走り回るのです。

いざ!

…残念ながら、…見当たりません。

そもそも…
「バッチレンダリング」や「レンダリング後に保存」は、実行中にでもC4Dの操作ができます。
が、プラグインやスクリプトに上のコードを入力して実行中すると、操作ができなくなるわけで、根本的に性質が違うのだろうし…

while()でレンダリング中の待機無限ループ中に、C4D自体の更新は行われるのだろうか?
無限ループ中は、C4D自体がOSに対して「応答なし」になるから、行われないだろう。
状態にせよ、フラグにせよ、イベントにせよ、C4D自体が更新できなければ、レンダリングが終わっても、状態もフラグもイベントも変化しないだろう…
だから、強制終了しない限り無限ループのままじゃないだろうか?

最近の腐りかけた自分の脳には、無理だね…

もし、この記事を読んでいる人で、解決策がある人はMOMOに是非書き込んでください。

代替案とも書いてあるね…

「バッチレンダリング」を諦めて「レンダリング後に保存」を利用した方法が代替案だね…

もっと別の…

ステージオブジェクトとか使うのなら、以前取り上げた記事
http://villager-and-c4d.cocolog-nifty.com/blog/2009/04/artist-side10-e.html
http://villager-and-c4d.cocolog-nifty.com/blog/2009/04/artist-side10-0.html
ですが、これをバッチレンダリングとは言わないしね…
これは、複数カメラを1フレームづつ切り替えるだけで、実際にこれ自体がレンダリングに関わっているわけではないですし。
アニメーションシーンファイルにも対応できないし…

ステージオブジェクトを使って対応しようとすると、大変な気がする。

複数のシーンファイルだから…
複数のシーンファイルをマージして1つのシーンファイルにする。
アニメーションなどの設定が有るかも知れないので、有ればキーフレームをシーンファイル毎にシフトさせる。面倒臭そう…
そもそも、全てのオブジェクトが全てのシーンファイル出現しているわけではないだろうから、シーンファイル毎に表示のON/OFFを設定しないと…
キーフレームを使うか?
レンダリング…
「レンダリング後に保存」だよね…
複数のシーンファイルに静止画のシーンファイルが混ざっていても、1本の動画ファイルにするのか?
レンダリング設定で開始/終了フレームで複数回に分けてレンダリング?
先ほど無理だったから却下。
画像サイズ(解像度やアスペクト等)が全部同じサイズになってしまうね。

そう考えると、無茶だなぁ。

StudioMOMOで答えてあげたかったけど、やはり自分には答えられないので、誰かが答えるのを静かに見守る事にします。
でも自己解決されると、自分がわからないままになってしまうなぁ。残念だ。

最近、MOMOのC4Dに解答してくれる人、少ないね。自分も含めてだけど…
解答した事は有っても、恥かしいから「村人」名義で解答した事は、一度も無いんですけどね…

このブログの方が、支離滅裂で恥かしいかも…

|

« C4D 新たに、ポリゴンオブジェクトを一体化するスクリプトを作ってみよう。 | トップページ | C4DのC.O.F.F.E.E.で「ヘロンの公式」を使って、ポリゴンの面積を求めてみる »