« C4D Python R12 テスト:生成したスプラインにセグメントを設定してみる。 | トップページ | C4D Python R12 テスト:ベジエタイプのスプラインオブジェクトを生成して、ハンドルの設定もしてみる。 »

C4D Python R12 テスト:ポイントを円形に配置して円形スプライン作ってみる。

ポイントを円形に配置する…
sin とcosを使って…

数学が苦手だと、sin、cosて聞いただけで鳥肌ものかなぁ…?

Circlespline_01

中学数学だっけ?忘れたなぁ…

今回は円形にポイントを配置するのが目的なので、ベジエでのハンドル操作はしません。
スプラインの補間は「3次」を使います。
「3次」だと、ポイント数が少ないと円に見えないね。
最低限のポイント数は?
6個じゃ駄目っぽいね、じゃぁ倍の12個にしてみた。

Circlespline_02

ポイント数は、12個で…
360°÷12個 = 30°

sin/cosそれから、度からラジアンに変換するradiansを使用するので、Pythonのmathモジュールを使います。

Python
"""
円形スプラインオブジェクトの生成(Python.mathモジュール使用)
2011.3.10
"""


import math #sin,cos,radiansを使用する為のPythonのmathモジュール
import c4d


def CreateSplineObject():
    pt_count = 12 #ポイント数
    deg = 360.0 / pt_count #1ポイントあたりの角度
    r = 100.0 #半径
   
    #スプラインオブジェクトのアロケート
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(pt_count)
   
    #ポイントの作成
    for id in xrange(pt_count):
        rad = math.radians(deg * id)
        obj.SetPoint(id, c4d.Vector(math.cos(rad) * r, math.sin(rad) * r, 0.0))
   
    #スプラインタイプ:3次
    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINETYPE_CUBIC
   
    #スプラインを閉じる
    obj[c4d.SPLINEOBJECT_CLOSED] = True
   
    #オブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)
    return obj



def main():
    slinobj = CreateSplineObject()
   
    #シーンに追加
    doc.InsertObject(slinobj, None, None, True)
   
    c4d.EventAdd()



if __name__=='__main__':
    main()

結果はこんな具合。

Circlespline_05

Pythonのmathモジュールを使わないでc4dだけで行うには…
c4dモジュールにも、sin/cos/ラジアン変換はc4d.utilsモジュールにあります。

sins, coss = utils.SinCos(rad)

sin,cosは、一気に2つとも取得できます。

rad = utils.Rad(deg)

ラジアン変換も問題ありません。

では、c4dモジュールのみだと…
pythonのmathモジュールのインポートをc4d.utilsモジュールのインポートへ変更。
「#ポイントの作成」部分を変更。

Python
"""
円形スプラインオブジェクトの生成(c4dのみ)
2011.3.10
"""


import c4d
from c4d import utils


def CreateSplineObject():
    pt_count = 12 #ポイント数
    deg = 360.0 / pt_count #1ポイントあたりの角度
    r = 100.0 #半径
   
    #スプラインオブジェクトのアロケート
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(pt_count)
   
    #ポイントの作成
    for id in xrange(pt_count):
        rad = utils.Rad(deg * id)
        sins, coss = utils.SinCos(rad)
        obj.SetPoint(id, c4d.Vector(coss * r, sins * r, 0.0))
   
    #スプラインタイプ:3次
    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINETYPE_CUBIC
   
    #スプラインを閉じる
    obj[c4d.SPLINEOBJECT_CLOSED] = True
   
    #オブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)
    return obj



def main():
    slinobj = CreateSplineObject()
   
    #シーンに追加
    doc.InsertObject(slinobj, None, None, True)
   
    c4d.EventAdd()



if __name__=='__main__':
    main()

sin/cosを使わずに、座標変換マトリクスを使って配置してみる。

z軸回転の座標変換マトリクスの生成は、utilsモジュールにあります。

zrot_m = utils.MatrixRotZ(rad)

z軸方向に向かって時計回りに変換されます。

今回はポイント(x:0.0、y:100.0、z:0.0)をz軸回転変換し、変換後の座標を更に変換していきます。
この方法だと、沢山変換すると誤差が出ると思うんだけど…

Circlespline_03

Python
"""
円形スプラインオブジェクトの生成(座標変換マトリクスを使ってみた)
2011.3.10
"""


import c4d
from c4d import utils


def CreateSplineObject():
    pt_count = 12 #ポイント数
    rad = utils.Rad(360.0 / pt_count) #1ポイントあたりのラジアン
    r = 100.0 #半径
    pt = c4d.Vector(0.0, r, 0.0)
   
    #スプラインオブジェクトのアロケート
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(pt_count)
   
    #ポイントの作成
    obj.SetPoint(0, pt)
    for id in xrange(1, pt_count):
        pt = utils.MatrixRotZ(rad) * pt
        obj.SetPoint(id, pt)
   
    #スプラインタイプ:3次
    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINETYPE_CUBIC
   
    #スプラインを閉じる
    obj[c4d.SPLINEOBJECT_CLOSED] = True
   
    #オブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)
    return obj



def main():
    slinobj = CreateSplineObject()
   
    #シーンに追加
    doc.InsertObject(slinobj, None, None, True)
   
    c4d.EventAdd()



if __name__=='__main__':
    main()

結果はこんな具合。

Circlespline_04

1ポイント毎にz軸回転座標変換をかけましたが、更にz軸方向へ移動変換を組み合わせて、螺旋スプラインを作ります。

trans_m = utils.MatrixMove(trans)

移動変換マトリクスの生成も問題ないようです。

49ポイント、回転ピッチ30°移動ピッチz軸方向に5なので、4回転分、長さ約240の螺旋。

Python
"""
螺旋スプラインオブジェクトの生成(座標変換マトリクスを使ってみた)
2011.3.10
"""


import c4d
from c4d import utils


def CreateSplineObject():
    pt_count = 49 #ポイント数
    rad = utils.Rad(30.0) #1ポイントあたりのラジアン
    trans = c4d.Vector(0.0, 0.0, 5.0) #1ポイントあたりの移動量
    r = 100.0 #半径
    pt = c4d.Vector(0.0, r, 0.0)
   
    #スプラインオブジェクトのアロケート
    obj = c4d.BaseObject(c4d.Ospline)
    obj.ResizeObject(pt_count)
   
    #ポイントの作成
    obj.SetPoint(0, pt)
    for id in xrange(1, pt_count):
        pt = utils.MatrixRotZ(rad) * utils.MatrixMove(trans) * pt
        obj.SetPoint(id, pt)
   
    #スプラインタイプ:3次
    obj[c4d.SPLINEOBJECT_TYPE] = c4d.SPLINETYPE_CUBIC
   
    #スプラインは閉じない
    obj[c4d.SPLINEOBJECT_CLOSED] = False
   
    #オブジェクトの更新
    obj.Message(c4d.MSG_UPDATE)
    return obj



def main():
    slinobj = CreateSplineObject()
   
    #シーンに追加
    doc.InsertObject(slinobj, None, None, True)
   
    c4d.EventAdd()



if __name__=='__main__':
    main()

結果は、こんな具合

Circlespline_06

今回は、この辺で終了…

|

« C4D Python R12 テスト:生成したスプラインにセグメントを設定してみる。 | トップページ | C4D Python R12 テスト:ベジエタイプのスプラインオブジェクトを生成して、ハンドルの設定もしてみる。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:生成したスプラインにセグメントを設定してみる。 | トップページ | C4D Python R12 テスト:ベジエタイプのスプラインオブジェクトを生成して、ハンドルの設定もしてみる。 »