« C4D Python R12 テスト:Python ジェネレータでスプラインを生成 | トップページ | C4D R13 改善されたモデリング機能の動画 »

C4D Python R12 テスト:Python ジェネレータでポリゴンオブジェクトを生成

最後に、Pythonジェネレータでポリゴンオブジェクトを生成してみよう。

C4D Pythonでポリゴンオブジェクトの生成も以前に書きまして…
http://villager-and-c4d.cocolog-nifty.com/blog/2011/02/c4d-python-r1-7.html

今回のテストでは、プリミティブ/スプライン/NURBSを使いましたが…
最後にポリゴンを試してみた。

Pythonジェネレータはmain()関数でBaseObjectを返せば良いので、ライトやデフォーマでも問題ないのだろう…

今回は、こんな形状のポリゴンオブジェクトを生成してみる。

Pythongene_22

ユーザデータは、サイズX/サイズY/サイズZ/ベベルの4個の実数です。

Pythongene_23_2

このポリゴンオブジェクトには、フェイス/ベベル/コーナーの選択範囲が設定されています。

Pythongene_24

フェイス部/ベベル部/コーナ部に別々のマテリアルを設定できるようになっています。
マッピングもUVWにも対応するようUVWの設定もしてあります。

コーディングには芸が無いですが、何をしているか簡単に理解できると思います。

Python
import c4d
import math
#Welcome to the world of Python


def create_polygon(x, y, z, b):
    bh = b/math.sqrt(2)
   
    obj = c4d.BaseObject(c4d.Opolygon)
    obj.ResizeObject(24, 26)
   
    #ポイント設定
    #フェイス1
    obj.SetPoint( 0, c4d.Vector( x/2,  y/2-bh,  z/2-bh))
    obj.SetPoint( 1, c4d.Vector( x/2, -y/2+bh,  z/2-bh))
    obj.SetPoint( 2, c4d.Vector( x/2, -y/2+bh, -z/2+bh))
    obj.SetPoint( 3, c4d.Vector( x/2,  y/2-bh, -z/2+bh))
   
    #フェイス2
    obj.SetPoint( 4, c4d.Vector( x/2-bh,  y/2-bh, -z/2))
    obj.SetPoint( 5, c4d.Vector( x/2-bh, -y/2+bh, -z/2))
    obj.SetPoint( 6, c4d.Vector(-x/2+bh, -y/2+bh, -z/2))
    obj.SetPoint( 7, c4d.Vector(-x/2+bh,  y/2-bh, -z/2))
   
    #フェイス3
    obj.SetPoint( 8, c4d.Vector(-x/2,  y/2-bh, -z/2+bh))
    obj.SetPoint( 9, c4d.Vector(-x/2, -y/2+bh, -z/2+bh))
    obj.SetPoint(10, c4d.Vector(-x/2, -y/2+bh,  z/2-bh))
    obj.SetPoint(11, c4d.Vector(-x/2,  y/2-bh,  z/2-bh))
   
    #フェイス4
    obj.SetPoint(12, c4d.Vector(-x/2+bh,  y/2-bh, z/2))
    obj.SetPoint(13, c4d.Vector(-x/2+bh, -y/2+bh, z/2))
    obj.SetPoint(14, c4d.Vector( x/2-bh, -y/2+bh, z/2))
    obj.SetPoint(15, c4d.Vector( x/2-bh,  y/2-bh, z/2))
   
    #フェイス5
    obj.SetPoint(16, c4d.Vector( x/2-bh, y/2,  z/2-bh))
    obj.SetPoint(17, c4d.Vector( x/2-bh, y/2, -z/2+bh))
    obj.SetPoint(18, c4d.Vector(-x/2+bh, y/2, -z/2+bh))
    obj.SetPoint(19, c4d.Vector(-x/2+bh, y/2,  z/2-bh))
   
    #フェイス6
    obj.SetPoint(20, c4d.Vector( x/2-bh, -y/2, -z/2+bh))
    obj.SetPoint(21, c4d.Vector( x/2-bh, -y/2,  z/2-bh))
    obj.SetPoint(22, c4d.Vector(-x/2+bh, -y/2,  z/2-bh))
    obj.SetPoint(23, c4d.Vector(-x/2+bh, -y/2, -z/2+bh))
   
    #ポリゴン設定
    #フェイス A
    obj.SetPolygon( 0, c4d.CPolygon(  0,  1,  2,  3))
    obj.SetPolygon( 1, c4d.CPolygon(  4,  5,  6,  7))
    obj.SetPolygon( 2, c4d.CPolygon(  8,  9, 10, 11))
    obj.SetPolygon( 3, c4d.CPolygon( 12, 13, 14, 15))
    obj.SetPolygon( 4, c4d.CPolygon( 16, 17, 18, 19))
    obj.SetPolygon( 5, c4d.CPolygon( 20, 21, 22, 23))
   
    #ベベル B
    obj.SetPolygon( 6, c4d.CPolygon(  3,  2,  5,  4))
    obj.SetPolygon( 7, c4d.CPolygon(  7,  6,  9,  8))
    obj.SetPolygon( 8, c4d.CPolygon( 11, 10, 13, 12))
    obj.SetPolygon( 9, c4d.CPolygon( 15, 14,  1,  0))
    obj.SetPolygon(10, c4d.CPolygon( 16,  0,  3, 17))
    obj.SetPolygon(11, c4d.CPolygon( 17,  4,  7, 18))
    obj.SetPolygon(12, c4d.CPolygon( 18,  8, 11, 19))
    obj.SetPolygon(13, c4d.CPolygon( 19, 12, 15, 16))
    obj.SetPolygon(14, c4d.CPolygon(  1, 21, 20,  2))
    obj.SetPolygon(15, c4d.CPolygon(  5, 20, 23,  6))
    obj.SetPolygon(16, c4d.CPolygon(  9, 23, 22, 10))
    obj.SetPolygon(17, c4d.CPolygon( 13, 22, 21, 14))
   
    #コーナー C
    obj.SetPolygon(18, c4d.CPolygon( 16, 15,  0))
    obj.SetPolygon(19, c4d.CPolygon( 17,  3,  4))
    obj.SetPolygon(20, c4d.CPolygon( 18,  7,  8))
    obj.SetPolygon(21, c4d.CPolygon( 19, 11, 12))
    obj.SetPolygon(22, c4d.CPolygon( 14, 21,  1))
    obj.SetPolygon(23, c4d.CPolygon(  2, 20,  5))
    obj.SetPolygon(24, c4d.CPolygon(  6, 23,  9))
    obj.SetPolygon(25, c4d.CPolygon( 10, 22, 13))
   
    obj.Message(c4d.MSG_UPDATE)
    return obj


def main():
    #ユーザデータの読み取り
    x = op[c4d.ID_USERDATA, 1]
    y = op[c4d.ID_USERDATA, 2]
    z = op[c4d.ID_USERDATA, 3]
    b = op[c4d.ID_USERDATA, 4]
   
    obj = create_polygon(x, y, z, b)
   
    #ポリゴン選択範囲 A
    tag = obj.MakeTag(c4d.Tpolygonselection)
    tag[c4d.ID_BASELIST_NAME] = 'A'
    sel = tag.GetBaseSelect()
    for c in xrange(0, 6):
        sel.Select(c)
   
    #ポリゴン選択範囲 B
    tag = obj.MakeTag(c4d.Tpolygonselection)
    tag[c4d.ID_BASELIST_NAME] = 'B'
    sel = tag.GetBaseSelect()
    for c in xrange(6, 18):
        sel.Select(c)
   
    #ポリゴン選択範囲 C
    tag = obj.MakeTag(c4d.Tpolygonselection)
    tag[c4d.ID_BASELIST_NAME] = 'C'
    sel = tag.GetBaseSelect()
    for c in xrange(18, 26):
        sel.Select(c)
   
    #UVW
    rt = c4d.Vector(1.0, 0.0, 0.0) #右上
    rb = c4d.Vector(1.0, 1.0, 0.0) #右下
    lb = c4d.Vector(0.0, 1.0, 0.0) #左下
    lt = c4d.Vector(0.0, 0.0, 0.0) #左上
    ct = c4d.Vector(0.5, 0.0, 0.0) #中上
    cb = c4d.Vector(0.5, 1.0, 0.0) #中下
   
    tag = obj.MakeVariableTag(c4d.Tuvw, obj.GetPolygonCount())
    #フェイス/ベベル
    for c in xrange(0, 18):
        tag.SetSlow(c, rt, rb, lb, lt)
    #上コーナー
    for c in xrange(18, 22):
        tag.SetSlow(c, ct, rb, lb, lb)
    #下コーナー
    for c in xrange(22, 26):
        tag.SetSlow(c, rt, cb, lt, lt)
   
    #スムーズ
    tag = obj.MakeTag(c4d.Tphong)
    tag[c4d.PHONGTAG_PHONG_ANGLELIMIT] = True
    tag[c4d.PHONGTAG_PHONG_ANGLE] = c4d.utils.Rad(30.0)
   
    return obj

このブログでC4D PythonでのUVWの設定は初めてだろうか?

UVW座標はこんな具合で…
座標の数値は、0.0~1.0

Pythongene_26

ポリゴン選択範囲の設定にSelectAll()を使おうと思ったのですが、うまく動作しなかったので、forとSelect()を使いました。
原因はわからず…

試しにPythonジェネレータに3種類のチェック柄のマテリアルをUVWで適用して見ます。
テクスチャタグの「選択範囲に限定」にそれぞれA/B/Cを指定します。

Pythongene_25

問題なく適用されています。

スクリプトで、オブジェクトを構築するのは面倒だね…
ま、使い方しだいで面白いものが作れると思う。
今回は、基本的な事だけで…

何かの参考になれば幸い…

|

« C4D Python R12 テスト:Python ジェネレータでスプラインを生成 | トップページ | C4D R13 改善されたモデリング機能の動画 »

コメント

コメントを書く



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




« C4D Python R12 テスト:Python ジェネレータでスプラインを生成 | トップページ | C4D R13 改善されたモデリング機能の動画 »