Cinema 4DのPython練習がてらシーンにダイナミックにオブジェクトを追加するスクリプトを作成しました.オブジェクトを追加するだけなので特にどうという機能でもないですが,例えばカスタムマテリアル用のプレビューシーンを独自に作成したい場合などに使えます.カスタムマテリアルを作成したら仮想シーン内にこれらのオブジェクトを追加してプレビューに使うなどですね.
import c4d
from c4d import gui
def main():
doc = c4d.documents.GetActiveDocument()
doc.StartUndo()
# add plane
plane = c4d.BaseObject(c4d.Oplane)
plane.SetName("Object")
plane[c4d.PRIM_PLANE_WIDTH] = 100
plane[c4d.PRIM_PLANE_HEIGHT] = 100
plane[c4d.PRIM_PLANE_SUBW] = 20
plane[c4d.PRIM_PLANE_SUBH] = 20
plane[c4d.PRIM_AXIS] = c4d.PRIM_AXIS_YN
plane[c4d.ID_BASEOBJECT_VISIBILITY_RENDER] = 1
plane.SetAbsPos(c4d.Vector(0, 140, 0))
doc.InsertObject(plane)
plane.MakeTag(c4d.Ttexture)
doc.AddUndo(c4d.UNDOTYPE_NEW, plane)
# add hari object and set root object
hairObj = c4d.BaseObject(c4d.Ohair)
hairObj.SetName("Object")
hairObj[c4d.HAIRSTYLE_LINK] = plane
hairObj[c4d.HAIRSTYLE_HAIR_COUNT] = 100
hairObj[c4d.HAIRSTYLE_HAIR_SEGMENTS] = 6
hairObj[c4d.HAIRSTYLE_COUNT] = 10
hairObj[c4d.HAIRSTYLE_LENGTH] = 230
hairObj[c4d.HAIRSTYLE_SEGMENTS] = 5
hairObj[c4d.HAIRSTYLE_ROOT_PLACEMENT] = c4d.HAIRSTYLE_ROOT_PLACEMENT_AREA
doc.InsertObject(hairObj)
doc.AddUndo(c4d.UNDOTYPE_NEW, hairObj)
# hair material
hairMat = c4d.BaseMaterial(c4d.Mhair)
hairMat.SetName("Hair mat")
hairMat[c4d.HAIRMATERIAL_USE_THICKNESS] = True
hairMat[c4d.HAIRMATERIAL_THICKNESS_ROOT] = 3
hairMat[c4d.HAIRMATERIAL_THICKNESS_TIP] = 1
hairMat[c4d.HAIRMATERIAL_USE_BEND] = True
hairMat[c4d.HAIRMATERIAL_BEND] = 0.4
doc.InsertMaterial(hairMat)
doc.AddUndo(c4d.UNDOTYPE_NEW, hairMat)
# hair material tag
hairMatTag = c4d.BaseTag(c4d.Thairmaterial)
hairMatTag[c4d.HAIRMATERIAL_TAG_LINK] = hairMat
hairObj.InsertTag(hairMatTag)
hairObj.MakeTag(c4d.Ttexture)
c4d.EventAdd()
doc.EndUndo()
# Execute main()
if __name__=='__main__':
main()
各行でやっていることはオブジェクトを作成して,必要なパラメータをセットした後に,ドキュメントに挿入しているだけです.Cinema 4Dではアンドゥの設定の仕方をきちんとしないといけません.アンドゥタイプによっては実行前に記述しなくてはいけないものもあり,いつも迷ってしまいます.
シーン内にオブジェクトやタグ,マテリアルを追加できるので,次のようにカスタムマテリアル専用のプレビューシーンなどをダイナミックに作成できます.単独では何に使うか迷ってしまいそうですが,他のプラグインやスクリプトと組み合わせることができますね.
また,シーンに挿入しないことも出来るので,スクリプト内で何かオブジェクトが必要になった時など,一時的に作成して使うといったこともできそうです.