Softimage 頂点を渡すとグローバルの座標が戻される関数
ツイッタ―でJunkiさんから「XSIのスクリプトで頂点のグローバル座標の値を取得する方法」というお題が上がったので勉強がてらに調査。TERAさんが光の速度で「Mathの中に、”MapObjectPositionToWorldSpace” というメソッドがある」ということを突き止めたので無事解決かと思いきや、どうやらMapObjectPositionToWorldSpaceメソッドはグローバル座標ではなく「直接の親からの相対値」を戻す仕様であることが判明。
SDKには「指定されたObjectSpaceで記述された位置を、WorldSpaceに変換します。」って思いっきり書いてるのに…。Autodeskの凡ミス?
■追記
どうやら、SDKのサンプル構文が親のオブジェクトのLocal座標系を取得していたようで、きちんとMapObjectPositionToWorldSpaceメソッドでもグローバル座標取得出来たッス…。
こんなかんじ↓↓↓
var oObj = Selection(0); var oGeometry = oObj.ActivePrimitive.Geometry var oTrans = oObj.Kinematics.Global.Transform; var oPos = oGeometry.Points(0).Position; var oGlobalPos = XSIMath.MapObjectPositionToWorldSpace( oTrans, oPos); Application.LogMessage ("The world position is: X "+ oGlobalPos.X + " Y " + oGlobalPos.Y + " Z " + oGlobalPos.Z);
自分の関数は頂点情報渡すだけでグローバル返ってくるっていう利点があるって事にしとく…orz
とにかく、そんなこんなで自分で関数書いてみました。
//頂点を渡すとグローバルの座標が戻される function GetGlobalData(in_Point){ //頂点 oPointTransform = XSIMath.CreateTransform(); var oPos = in_Point.Position; oPointTransform.SetTranslation( oPos ) ; var oPoint_Mat4 = oPointTransform.Matrix4;//行列に変換 //頂点が属するオブジェクト oParentObj = in_Point.Parent.Parent.Parent;//3DObject取得(スマートな取得の仕方がパッと出てこない) //行列を取得 var oParentObj_tf = oParentObj.Kinematics.Global.Transform; var oParentObj_Mat4 = oParentObj_tf.Matrix4; //頂点の行列とオブジェクトの行列をかけ合わせて 目的のグローバル行列を作成する var oMat4 = XSIMath.CreateMatrix4(); oMat4.Mul(oPoint_Mat4, oParentObj_Mat4); //各要素に分解する。 oNewTransform = XSIMath.CreateTransform() ; oNewTransform.SetMatrix4( oMat4 ); //移動 var oVector_pos = XSIMath.CreateVector3(); oNewTransform.GetTranslation( oVector_pos ) ; //回転 var oVector_rot = XSIMath.CreateVector3(); oNewTransform.GetRotationXYZAngles( oVector_rot ) ; return oNewTransform }
こんな感じで使います。
var oObj = Selection(0); var oGeometry = oObj.ActivePrimitive.Geometry; var oPos = GetGlobalData(oGeometry.Points(0)); logmessage(oPos.posx); logmessage(oPos.posy); logmessage(oPos.posz);