Help us understand the problem. What is going on with this article?

シーンにオブジェクトを作成する練習

More than 1 year has passed since last update.

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ではアンドゥの設定の仕方をきちんとしないといけません.アンドゥタイプによっては実行前に記述しなくてはいけないものもあり,いつも迷ってしまいます.

アンドゥに関するドキュメントはこちら

シーン内にオブジェクトやタグ,マテリアルを追加できるので,次のようにカスタムマテリアル専用のプレビューシーンなどをダイナミックに作成できます.単独では何に使うか迷ってしまいそうですが,他のプラグインやスクリプトと組み合わせることができますね.
20190224-2.jpg

また,シーンに挿入しないことも出来るので,スクリプト内で何かオブジェクトが必要になった時など,一時的に作成して使うといったこともできそうです.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした