« C4D Python R12 テスト:PolygonObjectのCreatePhongNormals()メソッドを試してみた。 | トップページ | C4D Python R12 テスト:スプライングラフを試してみた。 »

C4D Python R12 テスト:グラデーションバーをちょっとだけ試してみる。

C4Dのグラデーションは、グラデーションシェーダ等で使われているものだ…

C4d_gradient_01

ユーザデータでテストしてみた。
今回は、グラデーションを使って、何かをするわけではないです…

ヌルオブジェクトにグラデーションのユーザデータを設定して試してみます。

C4d_gradient_02

グラデーションは、c4dモジュールのCustomDataType.Gradientを使うんだね。

Python
import c4d


def main():
    if not op:return

    gra = op[c4d.ID_USERDATA,1]
    if not isinstance(gra, c4d.Gradient):return

    #ノット数の取得
    knot_count = gra.GetKnotCount()
    print knot_count

    print 'ok'


if __name__=='__main__':
    main()
    c4d.EventAdd()
2
ok

まずは、ノットの数を取得してみた。

C4d_gradient_03

続いては、ノットの位置やカラー等を取得してみた。

Python
import c4d


def main():
    if not op:return

    gra = op[c4d.ID_USERDATA,1]
    if not isinstance(gra, c4d.Gradient):return

    #ノット数の取得
    knot_count = gra.GetKnotCount()
    print knot_count

    #ノットの取得
    for knot_id in xrange(knot_count):
        print gra.GetKnot(knot_id)

    print 'ok'


if __name__=='__main__':
    main()
    c4d.EventAdd()

2
{'index': 1, 'bias': 0.5, 'pos': 0.0, 'col': Vector(0, 0, 0), 'brightness': 1.0}
{'index': 2, 'bias': 0.5, 'pos': 1.0, 'col': Vector(1, 1, 1), 'brightness': 1.0}
ok

GetKnot(id)の返り値は…

index インデックス
bias バイアスハンドルの位置
pos 位置
col カラー
brightness 強度

GetKnot(id)でパラメータとして渡したidと、取得した'index'は同じではありませんし、連番とも限りません。

試しに、2個のノットを追加して、最初に追加したノットを削除します。

C4d_gradient_04_2

ノットを削除した後にスクリプトを実行してみます。

3
{'index': 1, 'bias': 0.5, 'pos': 0.0, 'col': Vector(0, 0, 0), 'brightness': 1.0}
{'index': 2, 'bias': 0.5, 'pos': 1.0, 'col': Vector(1, 1, 1), 'brightness': 1.0}
{'index': 4, 'bias': 0.5, 'pos': 0.71740000000000004, 'col': Vector(0.711, 0.711, 0.711), 'brightness': 1.0}
ok

ノットの追加や削除の作業を繰り返すと上の結果のように、indexやposは順番に並びません。
ソートするノードは無いようだ。ソートする場合は自分でコーディングする必要があるね。

次に補間されたグラデーションの値を取得してみます。

Python
import c4d


def main():
    if not op:return

    gra = op[c4d.ID_USERDATA,1]
    if not isinstance(gra, c4d.Gradient):return

    #ノット数の取得
    knot_count = gra.GetKnotCount()
    print knot_count

    #ノットの取得
    for knot_id in xrange(knot_count):
        print gra.GetKnot(knot_id)

    #補間されたグラデーション値の取得
    gra.InitRender()
    for pos in xrange(11):
        print pos * 0.1, gra.CalcGradientPixel(pos * 0.1)
    gra.FreeRender()

    print 'ok'


if __name__=='__main__':
    main()
    c4d.EventAdd()

2
{'index': 1, 'bias': 0.5, 'pos': 0.0, 'col': Vector(0, 0, 0), 'brightness': 1.0}
{'index': 2, 'bias': 0.5, 'pos': 1.0, 'col': Vector(1, 1, 1), 'brightness': 1.0}
0.0 Vector(0, 0, 0)
0.1 Vector(0.028, 0.028, 0.028)
0.2 Vector(0.104, 0.104, 0.104)
0.3 Vector(0.216, 0.216, 0.216)
0.4 Vector(0.352, 0.352, 0.352)
0.5 Vector(0.5, 0.5, 0.5)
0.6 Vector(0.648, 0.648, 0.648)
0.7 Vector(0.784, 0.784, 0.784)
0.8 Vector(0.896, 0.896, 0.896)
0.9 Vector(0.972, 0.972, 0.972)
1.0 Vector(1, 1, 1)
ok

CalcGradientPixel(pos)を実行する前に、InitRender()を必ず実行しないと補完されたグラデーションの値は取得できません。

最後にグラデーションにノットを追加してみる。

ランダムな位置にランダムなカラーを追加してみます。
Pythonの乱数を扱うrandomモジュールを使う。

Python
import c4d
import random #pythonの乱数モジュール


def main():
    if not op:return

    gra = op[c4d.ID_USERDATA,1]
    if not isinstance(gra, c4d.Gradient):return

    #ノット数の取得
    knot_count = gra.GetKnotCount()
    print knot_count

    #ノットの取得
    for knot_id in xrange(knot_count):
        print gra.GetKnot(knot_id)

    #補間されたグラデーション値の取得
    gra.InitRender()
    for pos in xrange(11):
        print pos * 0.1, gra.CalcGradientPixel(pos * 0.1)
    gra.FreeRender()

    #ノットの挿入
    #ランダム位置とランダムカラーの設定
    for c in xrange(5):
        knot_pos = random.random()
        knot_col = c4d.Vector(random.random(), random.random(), random.random())
       
        gra.InsertKnot(col=knot_col, pos=knot_pos)
        print gra.GetKnotCount()
   
    print 'ok'


if __name__=='__main__':
    main()
    c4d.EventAdd()

2
{'index': 1, 'bias': 0.5, 'pos': 0.0, 'col': Vector(0, 0, 0), 'brightness': 1.0}
{'index': 2, 'bias': 0.5, 'pos': 1.0, 'col': Vector(1, 1, 1), 'brightness': 1.0}
0.0 Vector(0, 0, 0)
0.1 Vector(0.028, 0.028, 0.028)
0.2 Vector(0.104, 0.104, 0.104)
0.3 Vector(0.216, 0.216, 0.216)
0.4 Vector(0.352, 0.352, 0.352)
0.5 Vector(0.5, 0.5, 0.5)
0.6 Vector(0.648, 0.648, 0.648)
0.7 Vector(0.784, 0.784, 0.784)
0.8 Vector(0.896, 0.896, 0.896)
0.9 Vector(0.972, 0.972, 0.972)
1.0 Vector(1, 1, 1)
3
4
5
6
7
ok

コンソールでは、ノットが追加されているのがわかりますが…
属性マネージャのグラデーションの方が変わりませんね…

C4d_gradient_02

op.Message()でオブジェクトの更新が必要か?と思ったけど…
単純に、変更したc4d.Gradientをユーザデータへ設定すると良いだけだった。

Python
import c4d
import random #pythonの乱数モジュール


def main():
    if not op:return

    gra = op[c4d.ID_USERDATA,1]
    if not isinstance(gra, c4d.Gradient):return

    #ノット数の取得
    knot_count = gra.GetKnotCount()
    print knot_count

    #ノットの取得
    for knot_id in xrange(knot_count):
        print gra.GetKnot(knot_id)

    #補間されたグラデーション値の取得
    gra.InitRender()
    for pos in xrange(11):
        print pos * 0.1, gra.CalcGradientPixel(pos * 0.1)
    gra.FreeRender()

    #ノットの挿入
    #ランダム位置とランダムカラーの設定
    for c in xrange(5):
        knot_pos = random.random()
        knot_col = c4d.Vector(random.random(), random.random(), random.random())
       
        gra.InsertKnot(col=knot_col, pos=knot_pos)
        print gra.GetKnotCount()
   
    #オブジェクトユーザデータに変更したグラデーションを設定
    op[c4d.ID_USERDATA,1] = gra
    print 'ok'


if __name__=='__main__':
    main()
    c4d.EventAdd()

C4d_gradient_05

属性マネージャのグラデーションは更新されました。
まだ他のメソッド…ノットの削除等がありますが、今回はこの辺で…

|

« C4D Python R12 テスト:PolygonObjectのCreatePhongNormals()メソッドを試してみた。 | トップページ | C4D Python R12 テスト:スプライングラフを試してみた。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:PolygonObjectのCreatePhongNormals()メソッドを試してみた。 | トップページ | C4D Python R12 テスト:スプライングラフを試してみた。 »