C4D.Python: Pythonオブジェクトで軸位置を底面の立方体を作る1

オブジェクトの作成方法が徐々に分かってきたし、実験ばかりじゃおもしくないのでこの辺でもう少し実践的なことをするために、Pythonジェネレータを作ってみることにした。作成するのは、「軸の位置が底面になっている立方体」。Cinema 4Dでよく不満として挙げられるのが、立方体の原点がオブジェクトの中心から動かせないという点。底面にするには、ポリゴンオブジェクトに変換するか、ヌルオブジェクトを親にするしかありません。ですので、軸位置を変えた立方体を作成します。



Pythonジェネレータを見てみる

Pythonジェネレータを作成するといきなり立方体が作成されます。

サンプルコードが入っているので、見てみましょう。

import c4d
#Welcome to the world of Python


def main():
    return c4d.BaseObject(c4d.Ocube)

importからdef mainの行は、C4D.PYTHON: はじめてのプログラムの解読で解説しているのは飛ばします。

シンプルにreturnの後にオブジェクトを指定するc4d.BaseObject(c4d.Ocube)があるだけです。returnの後にものがオブジェクトとして生成されるようです。ただ、これだと原点にオブジェクトが作られるだけで位置もサイズも何も決められません。特に位置を指定する命令も書けないので、returnの後を直接オブジェクトを指定するのではなく変数として書き出せるようにします。

まずは、C4D.PYTHON: オブジェクトの作成を参考に以下のように書きました。

import c4d
#Welcome to the world of Python


def main():
    obj = c4d.BaseObject(c4d.Ocube)
    return obj

objという変数に立方体を入れて、returnでその変数を返してみたところ無事動作しました。

立方体の位置を変える

この状態だと立方体は中心に作成されるので、普通のプリミティブと全く同じなので、立方体の位置を変えてみます。位置を変えるのは前にやったSetRelPos()を使います。ただ、原点を変えたいのでY方向に100動かします。(立方体のデフォルトはX:Y:Z=200:200*200なのでその半分の100)指定は、c4d.Vector()を使います。

def main():
    obj = c4d.BaseObject(c4d.Ocube)
    obj.SetRelPos(c4d.Vector(0,100,0))

    return obj

一応軸の中心が底面になりましたが、バウンディングボックスの表示とずれているのが気持ち悪いです。原因はよくわかりません。ジェネレータに対して立方体の相対位置がずれているのが原因でしょうか? 問題なさそうですが、気持ち悪いので別の方法を試してみます。

オブジェクトの属性パラメータで動かしてみる

SetRelPos()だとダメだったので立方体の座標パラメータに数字を入れる方法を試してみます。でもパラメータの記述方法や入力方法が分かりません。こういう時はスクリプトログを使います。スクリプトログは、自分が操作した内容をスクリプトのログとして記録してくれます。スクリプトログはスクリプトメニューから呼び出します。

呼び出すとスクリプトが記録されます。早速スクリプトログを呼び出すコマンドも記録されています。

立方体のY軸座標を知りたいので、立方体を作成して属性マネージャの座標タブP.Yを100にします。

なお、パラメータの調べ方には、コンソールの入力欄にパラメータをドラッグ&ドロップしても確認できます。

スクリプトログには「object()[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = 100」と記録されていました。object()は、オブジェクト形式の変数ということでしょうから、object()を変数objに変えてコードを書いてみます。

def main():
    obj = c4d.BaseObject(c4d.Ocube)
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = 100

    return obj

残念ながら結果は同じでした。

レンダリングも問題ないようなので、こういう時はすっぱり諦めて次に進みます。

その2に行く

 

One thought on “C4D.Python: Pythonオブジェクトで軸位置を底面の立方体を作る1

Comments are closed.