« C4D Python R12 テスト:ポリゴンオブジェクトのエッジ試してみる。 | トップページ | C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 »

C4D Python R12 テスト:任意のポイントやポリゴンの隣接ポリゴンを取得するc4d.utils.Neighborを試してみた。

COFFEEで任意のポリゴンの隣のポリゴンを取得するには、任意のポリゴンを構成するポイント番号の、ab,ba,bc,cb,cd,dc,da,adのセットのポイントを含む他のポリゴンをfor()等を使って検索する。

C4D PythonではutilsのNeighborを使うと、簡単にスクリプトが作れるようだ。

こんな感じのポリゴンオブジェクトを用意して試してみた。

Neighbor_02

ポリゴンオブジェクトは閉じていて、分離はしていません。

任意のポリゴンのエッジを指定して隣のポリゴンを取得する。

ポリゴン37のポイント32、4で構成されるエッジを挟んだ隣のポリゴン番号38を取得してみよう。

Neighbor_05

Python
import c4d
from c4d import utils


def main():
    if not isinstance(op, c4d.PolygonObject):
        return
    nibr = utils.Neighbor()
    nibr.Init(op)
    print nibr.GetNeighbor(32, 4, 37)
    print nibr.GetNeighbor(4, 32, 37) #ポイント順を反対にしたら?
    print nibr.GetNeighbor(32, 3, 37) #エッジでなければ?
    print 'ok'


if __name__=='__main__':
    main()
38
38
-1
ok

ポリゴンのエッジをまたいで隣接するポリゴンを取得するには、c4d.utils.Neighbor()のGetNeighbor()メソッドを使用する。

GetNeighbor(point1, point2, polygon)メソッドは、エッジを構成するポイントの順番は順不同で問題なし。
エッジを構成しないポイントを指定した場合は-1(c4d.NOTOK)が返されるようだ。

c4d.utils.Neighbor()のメソッドを使用する前にInit()メソッドでポリゴンオブジェクトを指定して初期化が必要。

任意のポイントの周りのポリゴンを取得する。

ポイント32の周りのポリゴン番号リスト[32, 33, 37, 38]を取得してみる。

Neighbor_06

Python
import c4d
from c4d import utils


def main():
    if not isinstance(op, c4d.PolygonObject):
        return
    nibr = utils.Neighbor()
    nibr.Init(op)
    print nibr.GetPointPolys(32)
    print 'ok'


if __name__=='__main__':
    main()
[38, 37, 33, 32]
ok

ポイントの周りのポリゴンを取得するには、c4d.utils.Neighbor()のGetPointPolys()メソッドを使用する。

取得したポリゴン番号の順番には規則性はないようだ。

任意のエッジの両サイドのポリゴンを取得する。

ポイント32、4で構成しているエッジの両サイドのポリゴン37,38を取得してみる。

Neighbor_07

Python
import c4d
from c4d import utils


def main():
    if not isinstance(op, c4d.PolygonObject):
        return
    nibr = utils.Neighbor()
    nibr.Init(op)
    print nibr.GetEdgePolys(32, 4)
    print nibr.GetEdgePolys(4, 32) #順番が逆だったら?
    print 'ok'


if __name__=='__main__':
    main()

(38, 37)
(38, 37)
ok

GetEdgePolys()メソッドもポイント番号の順番は順不同で問題ないようだ。

ところで、エッジの共有は2枚のポリゴンだけとは限らないよね。

Neighbor_09

こんな具合に作る事は少ないと思うけど…
これで、ポイント4、5で構成されたエッジを指定すると…

(3, 2)
(3, 2)
ok

ポリゴン1、2は無視された…
GetEdgePolys()メソッドは、ポリゴン2枚しか想定していないんだね。

ポリゴンオブジェクトの総エッジ数を取得する。

メソッドに指定するものはありません。

Python
import c4d
from c4d import utils


def main():
    if not isinstance(op, c4d.PolygonObject):
        return
    nibr = utils.Neighbor()
    nibr.Init(op)
    print nibr.GetEdgeCount()
    print 'ok'


if __name__=='__main__':
    main()
72
ok

エッジの総数は、GetEdgeCount()を使う。

縦エッジ(8×5)+横エッジ(8×4)=72
ところで、エッジの総本数を取得してどう使うのだろうか?
ポイントやポリゴンの様に配列で取得し、IDでアクセスできるのなら分かりますが…
まだ勉強不足だ…

ポリゴンの隣接情報を取得する。

ポリゴン37の隣接情報を取得してみる。

Neighbor_08

Python
import c4d
from c4d import utils


def main():
    if not isinstance(op, c4d.PolygonObject):
        return
    nibr = utils.Neighbor()
    nibr.Init(op)
    print nibr.GetPolyInfo(37)
    print 'ok'


if __name__=='__main__':
    main()

{'mark': (True, False, True, True), 'edge': (64, 70, 6, 69), 'face': (32, 38, 2, 36)}
ok

ポリゴンの隣接情報はGetPolyInfo()を使う。

よく分からない…
mark/edge/faceとありますが…
C4D Python SDK Documentには具体的な事は書いていない。

faceは隣接しているポリゴン番号で、エッジab,bc,cd,daの順で隣接ポリゴンが無い場合は-1になるようだ。
三角ポリゴンの場合は、エッジcdは無いので常に-1になるようです。

edgeは…
エッジab,bc,cd,daの順で…エッジにはIDでアクセスできるの?
エッジはポリゴンやポイントの様に、配列で取得できて、IDを使って取得できるものなのだろうか?
それとも算出するの?
全く分かりません。

markのbool値は一体何を意味しているのか?
三角ポリゴンの場合、3番目が必ずTrueになると記載しているのですが、四角ポリゴンはFalseなのだろうか?
でも、テストしたポリゴンオブジェクトのポリゴン37は四角ポリゴンで、3番目はTrueになっている。
SDKのテストコードも試したけど、いまいち分かりません。
markもface同様、エッジab,bc,cd,daのフラグの様ですが…
これも勉強不足だ…

隣接情報を全部並べてみたら、分かるかも…

ポリゴン隣接情報を全部取得して見てみる…

Python
import c4d
from c4d import utils


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

    form = {True:'三角', False:'四角'}

    nibr = utils.Neighbor()
    nibr.Init(op)
    poly_count = op.GetPolygonCount()
    poly = op.GetAllPolygons()

    for c in xrange(poly_count):
        print c, ':', form[poly[c].c == poly[c].d], nibr.GetPolyInfo(c)
    print 'ok'


if __name__=='__main__':
    main()

0 : 三角 {'mark': (False, False, True, False), 'edge': (0, 1, 0, 2), 'face': (35, 1, -1, 5)}
1 : 四角 {'mark': (False, False, False, True), 'edge': (3, 4, 5, 1), 'face': (36, 2, 6, 0)}
2 : 四角 {'mark': (False, False, False, True), 'edge': (6, 7, 8, 4), 'face': (37, 3, 7, 1)}
3 : 四角 {'mark': (False, False, False, True), 'edge': (9, 10, 11, 7), 'face': (38, 4, 8, 2)}
4 : 三角 {'mark': (False, False, True, True), 'edge': (12, 13, 0, 10), 'face': (39, 9, -1, 3)}
5 : 三角 {'mark': (True, False, True, False), 'edge': (2, 14, 0, 15), 'face': (0, 6, -1, 10)}
6 : 四角 {'mark': (True, False, False, True), 'edge': (5, 16, 17, 14), 'face': (1, 7, 11, 5)}
7 : 四角 {'mark': (True, False, False, True), 'edge': (8, 18, 19, 16), 'face': (2, 8, 12, 6)}
8 : 四角 {'mark': (True, False, False, True), 'edge': (11, 20, 21, 18), 'face': (3, 9, 13, 7)}
9 : 三角 {'mark': (True, False, True, True), 'edge': (13, 22, 0, 20), 'face': (4, 14, -1, 8)}
10 : 三角 {'mark': (True, False, True, False), 'edge': (15, 23, 0, 24), 'face': (5, 11, -1, 15)}
11 : 四角 {'mark': (True, False, False, True), 'edge': (17, 25, 26, 23), 'face': (6, 12, 16, 10)}
12 : 四角 {'mark': (True, False, False, True), 'edge': (19, 27, 28, 25), 'face': (7, 13, 17, 11)}
13 : 四角 {'mark': (True, False, False, True), 'edge': (21, 29, 30, 27), 'face': (8, 14, 18, 12)}
14 : 三角 {'mark': (True, False, True, True), 'edge': (22, 31, 0, 29), 'face': (9, 19, -1, 13)}
15 : 三角 {'mark': (True, False, True, False), 'edge': (24, 32, 0, 33), 'face': (10, 16, -1, 20)}
16 : 四角 {'mark': (True, False, False, True), 'edge': (26, 34, 35, 32), 'face': (11, 17, 21, 15)}
17 : 四角 {'mark': (True, False, False, True), 'edge': (28, 36, 37, 34), 'face': (12, 18, 22, 16)}
18 : 四角 {'mark': (True, False, False, True), 'edge': (30, 38, 39, 36), 'face': (13, 19, 23, 17)}
19 : 三角 {'mark': (True, False, True, True), 'edge': (31, 40, 0, 38), 'face': (14, 24, -1, 18)}
20 : 三角 {'mark': (True, False, True, False), 'edge': (33, 41, 0, 42), 'face': (15, 21, -1, 25)}
21 : 四角 {'mark': (True, False, False, True), 'edge': (35, 43, 44, 41), 'face': (16, 22, 26, 20)}
22 : 四角 {'mark': (True, False, False, True), 'edge': (37, 45, 46, 43), 'face': (17, 23, 27, 21)}
23 : 四角 {'mark': (True, False, False, True), 'edge': (39, 47, 48, 45), 'face': (18, 24, 28, 22)}
24 : 三角 {'mark': (True, False, True, True), 'edge': (40, 49, 0, 47), 'face': (19, 29, -1, 23)}
25 : 三角 {'mark': (True, False, True, False), 'edge': (42, 50, 0, 51), 'face': (20, 26, -1, 30)}
26 : 四角 {'mark': (True, False, False, True), 'edge': (44, 52, 53, 50), 'face': (21, 27, 31, 25)}
27 : 四角 {'mark': (True, False, False, True), 'edge': (46, 54, 55, 52), 'face': (22, 28, 32, 26)}
28 : 四角 {'mark': (True, False, False, True), 'edge': (48, 56, 57, 54), 'face': (23, 29, 33, 27)}
29 : 三角 {'mark': (True, False, True, True), 'edge': (49, 58, 0, 56), 'face': (24, 34, -1, 28)}
30 : 三角 {'mark': (True, False, True, False), 'edge': (51, 59, 0, 60), 'face': (25, 31, -1, 35)}
31 : 四角 {'mark': (True, False, False, True), 'edge': (53, 61, 62, 59), 'face': (26, 32, 36, 30)}
32 : 四角 {'mark': (True, False, False, True), 'edge': (55, 63, 64, 61), 'face': (27, 33, 37, 31)}
33 : 四角 {'mark': (True, False, False, True), 'edge': (57, 65, 66, 63), 'face': (28, 34, 38, 32)}
34 : 三角 {'mark': (True, False, True, True), 'edge': (58, 67, 0, 65), 'face': (29, 39, -1, 33)}
35 : 三角 {'mark': (True, False, True, True), 'edge': (60, 68, 0, 0), 'face': (30, 36, -1, 0)}
36 : 四角 {'mark': (True, False, True, True), 'edge': (62, 69, 3, 68), 'face': (31, 37, 1, 35)}
37 : 四角 {'mark': (True, False, True, True), 'edge': (64, 70, 6, 69), 'face': (32, 38, 2, 36)}
38 : 四角 {'mark': (True, False, True, True), 'edge': (66, 71, 9, 70), 'face': (33, 39, 3, 37)}
39 : 三角 {'mark': (True, True, True, True), 'edge': (67, 12, 0, 71), 'face': (34, 4, -1, 38)}
ok

全部並べてみても、markの規則性は分からないね。
3番目のフラグも、ポリゴン35までは、三角ならTrue/四角ならFalseですが、ポリゴン36から四角でもTrueだったりする。
残りの1番目、2番目、4番目の規則性も分からない。

faceは、問題なさそうだ。

edgeは、三角ポリゴンの3番目が0になっているが…本当は-1にすべきでは?

残念、全部並べてみても分かりませんでした。

|

« C4D Python R12 テスト:ポリゴンオブジェクトのエッジ試してみる。 | トップページ | C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 »

コメント

コメントを書く



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




« C4D Python R12 テスト:ポリゴンオブジェクトのエッジ試してみる。 | トップページ | C4D Python R12 テスト:Neighbor.GetPolyInfo()を使ってポリゴンのabに隣接するポリゴンを連続して選択してみる。 »