C4D.Python: オブジェクトの作成

今回は、スクリプトでオブジェクトを作成する方法を調べたところ、「c4d.BaseObject」というクラスを使うようです。Pythonのヘルプにこのページにサンプルが載っていたのでこれを調べて行きます。

サンプルを踏まえてスクリプトとして整形するとこうなります。今回も前回と同じくmain関数を作成してそれを実行するスクリプト。今回guiは使わないので、guiのモジュールの読み込み部分と不要なコメントは削除しました。

実行したらうまく動いてくれたので、一つ一つ見ていきます。

import c4d


def main():
    obj = c4d.BaseObject(c4d.Ocube) # 新規立方体を作成
    obj.SetRelPos(c4d.Vector(20))   # 立方体の位置を設定
    doc.InsertObject(obj)           # ドキュメント(シーン)にオブジェクトを挿入
    c4d.EventAdd()                  # グローバルイベントをメッセージを送る

if __name__=='__main__':
    main()



立方体の作成

    obj = c4d.BaseObject(c4d.Ocube)

まずは、objという変数を作ってそこに立方体を入れています。入れるオブジェクトの指定が、c4d.BaseObject(オブジェクトのタイプ)ということみたいです。オブジェクトのタイプのシンボル一覧はここにありました。重要なのが、入力時に頭に「c4d.」があるという点。c4d.BaseObject(Ocube)と書いてしまうとダメ。ちゃんとモジュールを指定しないとダメみたい。オブジェクトの指定は、Ocubeというオブジェクトタイプ以外にも数値による指定も行えるみたいです。立方体の場合は「5159」なので、以下のようにも記述できますね。

    obj = c4d.BaseObject(5159)

可読性はよくないけどこの数字のIDで動きました。

このシンボルかIDをもうちょっと簡単に調べられないの? と思ったら、スクリプトメニュー/コンソールを開いて、コンソールの入力欄にオブジェクトをドラッグしてenterキーを押すと、オブジェクトIDが取得できました。Cinversityの解説を見るとR12ではオブジェクトタイプも取得できたみたいだけどR19だとダメっぽい。

追記
海外の人に聞いたところIDとシンボルはC:\Program Files\MAXON\Cinema 4D R19\resource\coffeesymbols.hを見てみるとわかるそう。たしかにOcube=5159,と書いてあった。ただ、COFFEE用だからID番号でやったほうがいいらしい。

他のオブジェクト(ボロノイ分割)の作成を試して見る

ボロノイ分割オブジェクトを試してみました。まずは、IDを調べます。

ボロノイ分割のIDは「1036557」だとわかったので、下のように元のスクリプトのobjに入れる部分を修正して記述をしてみました。

    obj = c4d.BaseObject(1036557)

一応動きます。ただ、IDを調べた時のコンソールをよくみて見ると最初の部分が「c4d.BaseObject」ではなく、「c4d.VoronoiFracture」になっています。

BaseObject()をc4d.VoronoiFracture()したらどうなるの?と思って、次のように修正したらこれもうまく動作しました。

    obj = c4d.VoronoiFracture(1036557)

ヘルプを見たところ、VoronoiFractureもBaseObjectsに中に含まれるクラスみたいなので、それでどちらでも動くのかもしれません。

とりあえず引き続き次の行を見ていきます。

立方体の位置の指定

    obj.SetRelPos(c4d.Vector(20))   # 立方体の位置を設定

ヘルプを見たところ「SetRelPos()」はBaseObjectのメンバーで、相対位置を設定するためのものらしい。カッコ内の「c4d.Vector(20)」は、c4dのベクトルを扱うためのもののようで、一つの数字だとxyzがすべて共通になり、「c4d.Vector(10,20,30)」と記述するとX=10、Y=20、Z=30という扱いになるようです。

だから、この命令は「変数『obj』に対して、相対位置として『x/y/zを20/20/20』と設定ということです。

オブジェクトの挿入

スクリプト的には、この段階はメモリ上にはオブジェクトを作成されたけど、まだシーンに追加されていない状態ようなので、これをシーンに入れてやる命令が必要らしい。それが次の行。

    doc.InsertObject(obj)           # ドキュメント(シーン)にオブジェクトを挿入

いきなり「doc」という変数が出てきて??となって調べたところ、これは現在開いているドキュメント(シーンファイル)が代入された変数らしい。本来、現在の開いているシーンファイルを取得して、それを変数に入れるという工程が必要なところ、よく使うためか決まったものとして用意されているみたいです。

InsertObjectは、名前の通りオブジェクトを挿入、カッコ内は挿入するオブジェクトの変数ということになります。

なので命令としては、現在選択しているシーン(変数doc)に、変数objに指定されているオブジェクトを挿入しなさいということになります。

イベントを発生

    c4d.EventAdd()                  # グローバルイベントをメッセージを送る

最後のこの命令は、Cinema 4Dにイベントを起こすものらしい。オブジェクトの挿入の段階でオブジェクトは挿入できるが、スクリプトを実行しただけではビューにオブジェクトは現れない。挿入後にビューをリフレッシュしたりしないと実際には表示されません。なので、この命令を追加することで、挿入されたオブジェクトがビューにスクリプトが実行完了時にちゃんと表示されるようになります。

オブジェクトをタイプを探すのはちょっと面倒だけど、コンソールを使えばなんとかななりそう。ただ、オブジェクトをタイプをCinema 4D上で探す方法がないか調査してみます。