日々適当

hibitekitou

スライスツールをスクリプトから設定することを考える

xsi |2012-09-20
そうした時、ICE Treeでスライスを適用した方が頭の悪い僕には簡単でした、というお話。

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 ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。