myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | オブジェクトの中心でAlign

すみません、タイトルに困っていて、これで通じる?通じない?
ま、もう少し読んで頂ければ分かるかと思います。

今日は仕事を早く片付けちゃって、暇だったんでスクリプトを書いてみました。
結局これのため、帰りが遅くなってしまったw

でですね、オブジェクトのセンターの位置と関係なく、
そのオブジェクトの中心で他のオブジェクトの中心の位置に移動
したくなりました。

普通は「Move Center to Bounding Box」でセンターを中心に移動してから移動しますよね。
その方が楽でしょうけど、それはやりたくなくてですね。なんとなくですね。

実作業に役に立たないかもしれないけど、欲しくなったんですね、こういうの。

まぁ、練習ということでね。

で、どうせなら流行りの Python でやってみよう!

結果はこんな感じです:

 
#Python
x = Application
#オブジェクトを取得
#oObj0 = 動かしたいオブジェクト (先に選択したオブジェクト)
#oObj1 = ターゲットオブジェクト (このオブジェクトの位置に合わせたい)
oObj0 = x.selection(0)
oObj1 = x.selection(1)

#オブジェクトの中心を取得する
bbox0 = oObj0.ActivePrimitive.Geometry.GetBoundingBox()
bbox1 = oObj1.ActivePrimitive.Geometry.GetBoundingBox()

#GetBoundingBox[0,1,2]はセンターの位置をかえしてくれますが、
#これはローカル座標でバウンディングボックスの中心からどれぐらい離れてる数値になります。
#なので、オブジェクト1(oObj1)のグローバル位置にこの数値を足すと、
#オブジェクトの中心のグローバル位置がわかります。

#そして、oObj0の中心もずれている可能性があるので、この数値に
#oObj0のGetBoundingBox[0,1,2]を引きます。

targetX = (oObj1.kinematics.Global.posx.value + bbox1[0]) - bbox0[0]
targetY = (oObj1.kinematics.Global.posy.value + bbox1[1]) - bbox0[1]
targetZ = (oObj1.kinematics.Global.posz.value + bbox1[2]) - bbox0[2]

#あとは移動するだけです。
oObj0.kinematics.Global.posx = targetX
oObj0.kinematics.Global.posy = targetY
oObj0.kinematics.Global.posz = targetZ


これで、役に立たないかもしれないスクリプトの出来上がり!

説明になってますかね?

Pythonの練習としても凄く微妙だけど、もう書いちゃったんだから。

オブジェクトに回転が入っていたらローカルとグローバル値が混ざってしまうから変なことに移動されてしまいます。



追記

グローバル値とローカル値を混ぜるのはやっぱり良くないので(ていうかアホな考え方だな)、全部グローバルで書き直してみました。

仕組みは同じですが、バウンディングボックスはグローバル値に変えました。

 
#Python
x = Application
l = x.logmessage
#オブジェクトを取得
#oObj0 = 動かしたいオブジェクト (先に選択したオブジェクト)
#oObj1 = ターゲットオブジェクト (このオブジェクトの位置に合わせたい)
oObj0 = x.selection(0)
oObj1 = x.selection(1)

#オブジェクトの中心を取得する
bbox0 = x.GetBBox(oObj0)
bbox1 = x.GetBBox(oObj1)

#GetBBoxは中心値を出してくれないから最大値から最小値引く必要があります
#丸めないと0が変な数字になっちゃうので、小数点を4桁に丸めておきます。
bbox0x = round(bbox0(3)+ bbox0(0),4) /2
bbox0y = round(bbox0(4)+ bbox0(1),4) /2
bbox0z = round(bbox0(5)+ bbox0(2),4) /2
bbox1x = round(bbox1(3)+ bbox1(0),4) /2
bbox1y = round(bbox1(4)+ bbox1(1),4) /2
bbox1z = round(bbox1(5)+ bbox1(2),4) /2

#センターが中心から離れている距離
bbox0x_c = oObj0.kinematics.Global.posx.value - bbox0x
bbox0y_c = oObj0.kinematics.Global.posy.value - bbox0y
bbox0z_c = oObj0.kinematics.Global.posz.value - bbox0z
bbox1x_c = oObj1.kinematics.Global.posx.value - bbox1x
bbox1y_c = oObj1.kinematics.Global.posy.value - bbox1y
bbox1z_c = oObj1.kinematics.Global.posz.value - bbox1z

#ターゲットの距離の計算
targetX = oObj1.kinematics.Global.posx.value - bbox1x_c + bbox0x_c
targetY = oObj1.kinematics.Global.posy.value - bbox1y_c + bbox0y_c
targetZ = oObj1.kinematics.Global.posz.value - bbox1z_c + bbox0z_c

##あとは移動するだけです。
oObj0.kinematics.Global.posx = targetX
oObj0.kinematics.Global.posy = targetY
oObj0.kinematics.Global.posz = targetZ


よし、これで回転してもグローバル値で計算されるからOKです。

こんな使えなさそうなスクリプトに無駄に頑張るな俺・・・・。
早く寝よう。

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/108-e8b5f3b1
Use trackback on this entry.

まとめteみた.【SI | オブジェクトの中心でAlign】

すみません、タイトルに困っていて、これで通じる?通じない?ま、もう少し読んで頂ければ分かるかと思います。今日は仕事を早く片付けちゃって、暇だったんでスクリプトを書いてみ...

  • 2012/04/12(木) 22:05:17 |
  • まとめwoネタ速suru