« C4D Python R12 テスト:Python ジェネレータの取っ掛かり… | トップページ | C4D Python R12 テスト:Python ジェネレータでポリゴンオブジェクトを生成 »

C4D Python R12 テスト:Python ジェネレータでスプラインを生成

以前、C4D Pythonでスプラインオブジェクトを生成しましたな。
http://villager-and-c4d.cocolog-nifty.com/blog/2011/02/c4d-python-r1-8.html

セグメントの設定も試しましたな。
http://villager-and-c4d.cocolog-nifty.com/blog/2011/03/c4d-python-r1-2.html

これを踏まえて、Pythonジェネレータで試してみよう。

今回生成するスプラインは、こんな感じで…

Pythongene_16

次のスクリプトをPythonジェネレータに入力します。

Python
import c4d
#Welcome to the world of Python


def main():
    w = 200.0 #幅
    h = 200.0 #高さ
    th = 10.0 #太さ
   
    #スプラインオブジェクトの生成とポイント数の設定
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(20)
   
    #ポイントの設定
    obj.SetPoint( 0, c4d.Vector( w/2,  h/2, 0.0))
    obj.SetPoint( 1, c4d.Vector( w/2, -h/2, 0.0))
    obj.SetPoint( 2, c4d.Vector(-w/2, -h/2, 0.0))
    obj.SetPoint( 3, c4d.Vector(-w/2,  h/2, 0.0))
   
    obj.SetPoint( 4, c4d.Vector(w/2-th,   th/2, 0.0))
    obj.SetPoint( 5, c4d.Vector(w/2-th, h/2-th, 0.0))
    obj.SetPoint( 6, c4d.Vector(  th/2, h/2-th, 0.0))
    obj.SetPoint( 7, c4d.Vector(  th/2,   th/2, 0.0))
   
    obj.SetPoint( 8, c4d.Vector(w/2-th, -h/2+th, 0.0))
    obj.SetPoint( 9, c4d.Vector(w/2-th,   -th/2, 0.0))
    obj.SetPoint(10, c4d.Vector(  th/2,   -th/2, 0.0))
    obj.SetPoint(11, c4d.Vector(  th/2, -h/2+th, 0.0))
   
    obj.SetPoint(12, c4d.Vector(  -th/2,   th/2, 0.0))
    obj.SetPoint(13, c4d.Vector(  -th/2, h/2-th, 0.0))
    obj.SetPoint(14, c4d.Vector(-w/2+th, h/2-th, 0.0))
    obj.SetPoint(15, c4d.Vector(-w/2+th,   th/2, 0.0))
   
    obj.SetPoint(16, c4d.Vector(  -th/2, -h/2+th, 0.0))
    obj.SetPoint(17, c4d.Vector(  -th/2,   -th/2, 0.0))
    obj.SetPoint(18, c4d.Vector(-w/2+th,   -th/2, 0.0))
    obj.SetPoint(19, c4d.Vector(-w/2+th, -h/2+th, 0.0))
   
    #セグメントの設定
    obj.MakeVariableTag(c4d.Tsegment, 5)
    obj.SetSegment(0, 4, True)
    obj.SetSegment(1, 4, True)
    obj.SetSegment(2, 4, True)
    obj.SetSegment(3, 4, True)
    obj.SetSegment(4, 4, True)
   
    obj[c4d.SPLINEOBJECT_CLOSED] = True

    #スプラインオブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)

    return obj

問題が無ければ、スプラインが生成されます。

Pythongene_15

ユーザデータ(幅/高さ/太さ)を設定しスクリプトに割り当てます。

Pythongene_17

Python
import c4d
#Welcome to the world of Python


def main():
    w =  op[c4d.ID_USERDATA, 1] #幅
    h =  op[c4d.ID_USERDATA, 2] #高さ
    th = op[c4d.ID_USERDATA, 3] #太さ
   
    #スプラインオブジェクトの生成とポイント数の設定
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(20)
   
    #ポイントの設定
    obj.SetPoint( 0, c4d.Vector( w/2,  h/2, 0.0))
    obj.SetPoint( 1, c4d.Vector( w/2, -h/2, 0.0))
    obj.SetPoint( 2, c4d.Vector(-w/2, -h/2, 0.0))
    obj.SetPoint( 3, c4d.Vector(-w/2,  h/2, 0.0))
   
    obj.SetPoint( 4, c4d.Vector(w/2-th,   th/2, 0.0))
    obj.SetPoint( 5, c4d.Vector(w/2-th, h/2-th, 0.0))
    obj.SetPoint( 6, c4d.Vector(  th/2, h/2-th, 0.0))
    obj.SetPoint( 7, c4d.Vector(  th/2,   th/2, 0.0))
   
    obj.SetPoint( 8, c4d.Vector(w/2-th, -h/2+th, 0.0))
    obj.SetPoint( 9, c4d.Vector(w/2-th,   -th/2, 0.0))
    obj.SetPoint(10, c4d.Vector(  th/2,   -th/2, 0.0))
    obj.SetPoint(11, c4d.Vector(  th/2, -h/2+th, 0.0))
   
    obj.SetPoint(12, c4d.Vector(  -th/2,   th/2, 0.0))
    obj.SetPoint(13, c4d.Vector(  -th/2, h/2-th, 0.0))
    obj.SetPoint(14, c4d.Vector(-w/2+th, h/2-th, 0.0))
    obj.SetPoint(15, c4d.Vector(-w/2+th,   th/2, 0.0))
   
    obj.SetPoint(16, c4d.Vector(  -th/2, -h/2+th, 0.0))
    obj.SetPoint(17, c4d.Vector(  -th/2,   -th/2, 0.0))
    obj.SetPoint(18, c4d.Vector(-w/2+th,   -th/2, 0.0))
    obj.SetPoint(19, c4d.Vector(-w/2+th, -h/2+th, 0.0))
   
    #セグメントの設定
    obj.MakeVariableTag(c4d.Tsegment, 5)
    obj.SetSegment(0, 4, True)
    obj.SetSegment(1, 4, True)
    obj.SetSegment(2, 4, True)
    obj.SetSegment(3, 4, True)
    obj.SetSegment(4, 4, True)
   
    obj[c4d.SPLINEOBJECT_CLOSED] = True

    #スプラインオブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)

    return obj

これで、パラメータで大きさや枠の太さを変えることができます。

Pythongene_18

スプラインプリミティブ同様、ポイントモードにしてもスプラインのポイントはエディタビューには表示されません。

もちろん、Pythonジェネレータにも押し出しNURBSを適用する事ができます。

Pythongene_19

なるほどね…

それでは、押し出しNURBSも込みでPythonジェネレータで生成してみよう。

BaseObjectに指定する押し出しNURBSの定数は、c4d.Oextrude

ユーザデータには、押し出し量の「厚さ」を追加。

Pythongene_21

スクリプトも以下の様に変更する。

Python
import c4d
#Welcome to the world of Python


def create_spline(w, h, th):
    #スプラインオブジェクトの生成とポイント数の設定
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(20)
   
    #ポイントの設定
    obj.SetPoint( 0, c4d.Vector( w/2,  h/2, 0.0))
    obj.SetPoint( 1, c4d.Vector( w/2, -h/2, 0.0))
    obj.SetPoint( 2, c4d.Vector(-w/2, -h/2, 0.0))
    obj.SetPoint( 3, c4d.Vector(-w/2,  h/2, 0.0))
   
    obj.SetPoint( 4, c4d.Vector(w/2-th,   th/2, 0.0))
    obj.SetPoint( 5, c4d.Vector(w/2-th, h/2-th, 0.0))
    obj.SetPoint( 6, c4d.Vector(  th/2, h/2-th, 0.0))
    obj.SetPoint( 7, c4d.Vector(  th/2,   th/2, 0.0))
   
    obj.SetPoint( 8, c4d.Vector(w/2-th, -h/2+th, 0.0))
    obj.SetPoint( 9, c4d.Vector(w/2-th,   -th/2, 0.0))
    obj.SetPoint(10, c4d.Vector(  th/2,   -th/2, 0.0))
    obj.SetPoint(11, c4d.Vector(  th/2, -h/2+th, 0.0))
   
    obj.SetPoint(12, c4d.Vector(  -th/2,   th/2, 0.0))
    obj.SetPoint(13, c4d.Vector(  -th/2, h/2-th, 0.0))
    obj.SetPoint(14, c4d.Vector(-w/2+th, h/2-th, 0.0))
    obj.SetPoint(15, c4d.Vector(-w/2+th,   th/2, 0.0))
   
    obj.SetPoint(16, c4d.Vector(  -th/2, -h/2+th, 0.0))
    obj.SetPoint(17, c4d.Vector(  -th/2,   -th/2, 0.0))
    obj.SetPoint(18, c4d.Vector(-w/2+th,   -th/2, 0.0))
    obj.SetPoint(19, c4d.Vector(-w/2+th, -h/2+th, 0.0))
   
    #セグメントの設定
    obj.MakeVariableTag(c4d.Tsegment, 5)
    obj.SetSegment(0, 4, True)
    obj.SetSegment(1, 4, True)
    obj.SetSegment(2, 4, True)
    obj.SetSegment(3, 4, True)
    obj.SetSegment(4, 4, True)
   
    obj[c4d.SPLINEOBJECT_CLOSED] = True

    #スプラインオブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)

    return obj


def main():
    #ユーザデータ
    w =  op[c4d.ID_USERDATA, 1] #幅
    h =  op[c4d.ID_USERDATA, 2] #高さ
    th = op[c4d.ID_USERDATA, 3] #太さ
    ex = op[c4d.ID_USERDATA, 4] #厚さ

    #押し出しNURBS
    obj = c4d.BaseObject(c4d.Oextrude)
    obj[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0.0, 0.0, ex)

    #スプライン
    sp_obj = create_spline(w, h, th)
    sp_obj[c4d.ID_BASEOBJECT_REL_POSITION] = c4d.Vector(0.0, 0.0, -ex/2)
    sp_obj.InsertUnder(obj)

    return obj

問題がなければ、次の様に表示されるだろう。

Pythongene_20

これで、前回より興味が沸いてきただろうか?

|

« C4D Python R12 テスト:Python ジェネレータの取っ掛かり… | トップページ | C4D Python R12 テスト:Python ジェネレータでポリゴンオブジェクトを生成 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D Python R12 テスト:Python ジェネレータの取っ掛かり… | トップページ | C4D Python R12 テスト:Python ジェネレータでポリゴンオブジェクトを生成 »