« C4D Python R12 テスト:オブジェクトをスプライン等に配置する。 | トップページ | えぇ… »

C4D Python R12 テスト:オブジェクトのバウンディングBOX

バウンディングBOX…
日本語で正式には境界領域…だっけか?だったか…?

Python_boundingbox_01

早い話が、エディタビューでよく見るオレンジ色の領域の事だね…
という事は、座標マネージャのサイズがバウンディングBOXの大きさだね。

Python_boundingbox_02

Python_boundingbox_03

今回はZの値は0.0にしたので、XYのみで話を進めます。

Xの最大値は、右下のポイント、116.3
Xの最小値、左下のポイント、-50.0
Xのサイズは、116.3 - (-50.0) = 166.3

Yの最大値は、左上のポイント、97.4
Yの最小値、右下のポイント-92.6
Yのサイズは、97.4 - (-92.6) = 190.0

これをc4d Pythonで求めるには…

BaseObject.GetRad()

ただし、境界領域XYZの半分の値なんだね。

BaseObjectクラスのメソッドなので、プリミティブだろうがデフォーマだろうが、全てのオブジェクトが対象なんだね。

Python
import c4d


def main():
    print op.GetRad()


if __name__=='__main__':
    main()
Vector(83.185, 95.037, 0)

ごめんね… 上の図では小数点2位以下切り捨てたので値が少し誤差が出ましたが、許してください。
Xのサイズの半分、166.3 / 2 = 83.15
Yのサイズの半分、190.0 / 2 = 95.0

でも…サイズだけではバウンディングBOXとしては意味をなさないね。
バウンディングBOXの位置が求められていないね。

バウンディングBOXの位置、要するにバウンディングBOXの中心位置を求めるんだけど…

Xの最大値は、右下のポイント、116.3
Xの最小値、左下のポイント、-50.0
Xの中心は、(116.3 + (-50.0)) / 2 = 33.15

Yの最大値は、左上のポイント、97.4
Yの最小値、右下のポイント-92.6
Yの中心は、(97.4 + (-92.6)) / 2 = 2.4

Python_boundingbox_04

では、c4d PythonでバウンディングBOXの中心を求めるには…

BaseObject.GetMp()
Python
import c4d


def main():
    print op.GetRad()
    print op.GetMp()


if __name__=='__main__':
    main()
Vector(83.185, 95.037, 0)
Vector(33.185, 2.37, 0)

これも上の図と若干誤差はありますが、気にしないでください。

ポリゴンオブジェクト等のポイントオブジェクトは、forループを使って、ポイントのXYZそれぞれの最大値と最小値を求めてバウンディングBOXを求められますが… c4d Pythonは、この2つのメソッドがあるので、しかも全てのオブジェクトが対象でね…ラクチンね。
C.O.F.F.E.E.ならば、自前で求めなければいけませんけど…ポイントオブジェクトのみだけど…

じゃあ、試しに何か簡単なスクリプトを…

オブジェクトに「屈曲」デフォーマをピッタシサイズで配置する。

Python
'''
オブジェクトに屈曲デフォーマをぴったりサイズで配置する。
'''


import
c4d


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

    #選択オブジェクトのバウンディングBOXの取得
    size = op.GetRad()
    center = op.GetMp()

    #屈曲デフォーマの配置
    bends = c4d.BaseObject(c4d.Obend)
    bends.SetAbsPos(center)
    bends[c4d.DEFORMOBJECT_SIZE] = size * 2
    bends.InsertUnder(op)


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

Python_boundingbox_05

おお、確かにピッタシサイズで配置された…
驚くほどのものでもないか…

でもデフォーマのサイズって、ピッタシより少し遊びのぶぶん…若干大きめの方が良いんじゃないか?

Python
'''
オブジェクトに屈曲デフォーマを若干大きめサイズで配置する。
'''


import
c4d


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

    #選択オブジェクトのバウンディングBOXの取得
    size = op.GetRad()
    center = op.GetMp()

    #屈曲デフォーマの配置
    bends = c4d.BaseObject(c4d.Obend)
    bends.SetAbsPos(center)
    bends[c4d.DEFORMOBJECT_SIZE] = size * 2 + c4d.Vector(5.0)
    bends.InsertUnder(op)


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

Python_boundingbox_06

確かに、若干大きめに配置される。

けど、わざわざ書き直す必要もなかったかと…

ところで、ワールド空間でのバウンディングBOXは、求められないんだね…

Python_boundingbox_07

こんな具合に…

|

« C4D Python R12 テスト:オブジェクトをスプライン等に配置する。 | トップページ | えぇ… »

コメント

コメントを書く



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




« C4D Python R12 テスト:オブジェクトをスプライン等に配置する。 | トップページ | えぇ… »