hibitekitou
スライスツールをスクリプトから設定することを考える
xsi |2012-09-20
そうした時、ICE Treeでスライスを適用した方が頭の悪い僕には簡単でした、というお話。
Softimageのモデリングツールであるところのスライスは、スライスする面を、基準となる位置と Plane Normal で指定した軸を持つ平面をどれだけ回転させるかという値を指定することで、設定しています。
ぶった切る平面があるポリゴンを含んだものとする場合、基準となる位置はポリゴンの頂点の一つを指定すればいいし、その法線も取得できます。適当なスクリプトは以下の通り。ほんとはポリゴン一個ピックすればいいんだけうけど、とりあえず…(^^;
しかし、法線をいかに回転の情報に変換するか。えーと、どうしたらいいんでしょ、という感じです。XZ平面(Y軸を法線に持つ平面)の法線を、目的とする角度に回すための回転の情報を得るために、Y軸をぶった切る平面の法線に向きをそろえる変換行列を得られればいいって事なんでしょうけど、面倒そうです。四元数とか使うんかな?
一方、ICEのSlice Polygonを使うと、必要な値は、基準となる位置と、ぶった切る平面の法線でいいわけです。これは前述の通り取得可能です。
ってことで、こんな感じのICE Treeを作って、取得した適切な値を Slice Polygon ノードに指定してやればよろしいわけでね。
つーわけで、明日はそんな感じの適当なスクリプト組むつもり。
<追記>
ICEのSlice Polygonだと、任意のポリゴンのみスライスという事が出来なさそうな予感です。
仕方が無いので、モデリングツール側のスライスでどうにかする方法を見つけるべくネットをあさりました。
んでまぁ、理屈部分はともかくとして、問題となる変換行列が載っているページを発見。
右手座標系における任意の軸での回転行列 [最近のヒット!]
ここの行列から SIRotation.SetFromMatrix3(SIMatrix3) を使ってSIRotation オブジェクトを得て、そいつのメソッド GetXYZAngles(SIVector3)を使ってオイラー角を得るという方法で作る事が出来ましたですよ。
<追記>
一見うまく行っているように見えたんだけど、うまく行かない場合がある…。
回転について理解してからやらないと駄目だな、こりゃ。
</追記>
</追記>
Softimageのモデリングツールであるところのスライスは、スライスする面を、基準となる位置と Plane Normal で指定した軸を持つ平面をどれだけ回転させるかという値を指定することで、設定しています。
ぶった切る平面があるポリゴンを含んだものとする場合、基準となる位置はポリゴンの頂点の一つを指定すればいいし、その法線も取得できます。適当なスクリプトは以下の通り。ほんとはポリゴン一個ピックすればいいんだけうけど、とりあえず…(^^;
from win32com.client import constants as c app = Application log = app.Logmessage def PicedPntPosV(): v = XSIMath.CreateVector3() vG = XSIMath.CreateVector3() oPicked = app.PickElement(c.siPointFilter, "pick point", "pick point" ,"","","2" ) points = oPicked(2) oComponentCollection = points.SubComponent.ComponentCollection oObj = points.SubComponent.Parent3DObject v = oComponentCollection(0).Position oTrans = oObj.Kinematics.Global.Transform vG = XSIMath.MapObjectPositionToWorldSpace(oTrans,v) return vG v0 = XSIMath.CreateVector3() v1 = XSIMath.CreateVector3() v2 = XSIMath.CreateVector3() v0 = PicedPntPosV() v1 = PicedPntPosV() v2 = PicedPntPosV() vN = XSIMath.CreateVector3() vOnPlane1 = XSIMath.CreateVector3() vOnPlane2 = XSIMath.CreateVector3() vOnPlane1.Sub(v1,v0) vOnPlane2.Sub(v2,v0) vN.Cross(vOnPlane1, vOnPlane2) log("Plane Orign:" + str(v0.X) + "," + str(v0.Y) + "," + str(v0.Z)) log("Plane Normal:" + str(vN.X) + "," + str(vN.Y) + "," + str(vN.Z))
しかし、法線をいかに回転の情報に変換するか。えーと、どうしたらいいんでしょ、という感じです。XZ平面(Y軸を法線に持つ平面)の法線を、目的とする角度に回すための回転の情報を得るために、Y軸をぶった切る平面の法線に向きをそろえる変換行列を得られればいいって事なんでしょうけど、面倒そうです。四元数とか使うんかな?
一方、ICEのSlice Polygonを使うと、必要な値は、基準となる位置と、ぶった切る平面の法線でいいわけです。これは前述の通り取得可能です。
ってことで、こんな感じのICE Treeを作って、取得した適切な値を Slice Polygon ノードに指定してやればよろしいわけでね。
つーわけで、明日はそんな感じの適当なスクリプト組むつもり。
<追記>
ICEのSlice Polygonだと、任意のポリゴンのみスライスという事が出来なさそうな予感です。
仕方が無いので、モデリングツール側のスライスでどうにかする方法を見つけるべくネットをあさりました。
んでまぁ、理屈部分はともかくとして、問題となる変換行列が載っているページを発見。
右手座標系における任意の軸での回転行列 [最近のヒット!]
ここの行列から SIRotation.SetFromMatrix3(SIMatrix3) を使ってSIRotation オブジェクトを得て、そいつのメソッド GetXYZAngles(SIVector3)を使ってオイラー角を得るという方法で作る事が出来ましたですよ。
<追記>
一見うまく行っているように見えたんだけど、うまく行かない場合がある…。
回転について理解してからやらないと駄目だな、こりゃ。
</追記>
</追記>
コメント ( 0 )|Trackback ( )
コメント |
コメントはありません。 |
コメントを投稿する |
ブログ作成者から承認されるまでコメントは反映されません |