« C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 | トップページ | C4D Python R12 テスト:グラデーションバーをちょっとだけ試してみる。 »

C4D Python R12 テスト:PolygonObjectのCreatePhongNormals()メソッドを試してみた。

メモ代わりに書いただけ…

ポリゴンの各頂点のフォンシェーディングの法線が取得できるんだね…

Createphongnormals_01

CreatePhongNormals()メソッドはベクトルのリストを返します。
4個セットでポリゴン順に格納されているようだ。

ポリゴンnの各頂点a/b/c/dを求めるIDは…
a = n*4
b = n*4 + 1
c = n*4 + 2
d = n*4 + 3

メソッドでのSetPhongNormals()は用意されていないんだね。

コンソールにベクトル値を表示します。

Python
import c4d

vartex = ['a', 'b', 'c', 'd']

def main():
    if not isinstance(op, c4d.PolygonObject): return
    print op.GetName()

    pn = op.CreatePhongNormals()
    for poly_id in xrange(op.GetPolygonCount()):
        print poly_id
        for pnt in xrange(4):
            print vartex[pnt], ':', pn[poly_id*4 + pnt]


if __name__=='__main__':
    main()

立方体
0
a : Vector(0, 0, -1)
b : Vector(0, 0, -1)
c : Vector(0, 0, -1)
d : Vector(0, 0, -1)
1
a : Vector(1, 0, 0)
b : Vector(1, 0, 0)
c : Vector(1, 0, 0)
d : Vector(1, 0, 0)
2
a : Vector(0, 0, 1)
b : Vector(0, 0, 1)
c : Vector(0, 0, 1)
d : Vector(0, 0, 1)
3
a : Vector(-1, 0, 0)
b : Vector(-1, 0, 0)
c : Vector(-1, 0, 0)
d : Vector(-1, 0, 0)
4
a : Vector(0, 1, 0)
b : Vector(0, 1, 0)
c : Vector(0, 1, 0)
d : Vector(0, 1, 0)
5
a : Vector(0, -1, 0)
b : Vector(0, -1, 0)
c : Vector(0, -1, 0)
d : Vector(0, -1, 0)

試しに、立方体のスムーズタグの角度制限をoffにして試してみる。

Createphongnormals_02

Createphongnormals_03

全てのポリゴンは制限なしにスムージングが施されるわけだ。

Createphongnormals_04

立方体
0
a : Vector(-0.577, -0.577, -0.577)
b : Vector(-0.577, 0.577, -0.577)
c : Vector(0.577, 0.577, -0.577)
d : Vector(0.577, -0.577, -0.577)
1
a : Vector(0.577, -0.577, -0.577)
b : Vector(0.577, 0.577, -0.577)
c : Vector(0.577, 0.577, 0.577)
d : Vector(0.577, -0.577, 0.577)
2
a : Vector(0.577, -0.577, 0.577)
b : Vector(0.577, 0.577, 0.577)
c : Vector(-0.577, 0.577, 0.577)
d : Vector(-0.577, -0.577, 0.577)
3
a : Vector(-0.577, -0.577, 0.577)
b : Vector(-0.577, 0.577, 0.577)
c : Vector(-0.577, 0.577, -0.577)
d : Vector(-0.577, -0.577, -0.577)
4
a : Vector(-0.577, 0.577, -0.577)
b : Vector(-0.577, 0.577, 0.577)
c : Vector(0.577, 0.577, 0.577)
d : Vector(0.577, 0.577, -0.577)
5
a : Vector(-0.577, -0.577, 0.577)
b : Vector(-0.577, -0.577, -0.577)
c : Vector(0.577, -0.577, -0.577)
d : Vector(0.577, -0.577, 0.577)

先ほどと取得した法線ベクトルとは変わりました。

ちなみに、ポリゴンの法線は2本の対角線の外積で求めてください。

Createphongnormals_07

Python
import c4d

def main():
    if not isinstance(op, c4d.PolygonObject): return
    print op.GetName()

    poly = op.GetAllPolygons()
    pnts = op.GetAllPoints()
    for poly_id in xrange(op.GetPolygonCount()):
        print poly_id
        ac = pnts[poly[poly_id].a] - pnts[poly[poly_id].c]
        bd = pnts[poly[poly_id].b] - pnts[poly[poly_id].d]
        n = ac.Cross(bd).GetNormalized()
        print n


if __name__=='__main__':
    main()

立方体
0
Vector(0, 0, -1)
1
Vector(1, 0, 0)
2
Vector(0, 0, 1)
3
Vector(-1, 0, 0)
4
Vector(0, 1, 0)
5
Vector(0, -1, 0)

C4D Pythonの場合、外積はc4d.VectorのCross()メソッドで、正規化したベクトルはGetNormalized()メソッドで取得できます。
ベクトル自体を正規化する場合は、Normalize()メソッドで行います。

|

« C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 | トップページ | C4D Python R12 テスト:グラデーションバーをちょっとだけ試してみる。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 | トップページ | C4D Python R12 テスト:グラデーションバーをちょっとだけ試してみる。 »