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




※上記画像はJunkiさんのツイッタ―から拝借しました。

とにかく、そんなこんなで自分で関数書いてみました。

//頂点を渡すとグローバルの座標が戻される
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);