2012年2月11日土曜日

MAXScript ノードのプロパティを変更


/*
 vFromベクトルからvToベクトルまでの角度を取得
*/
fn GetAngle vFrom vTo =
(
 vFrom = normalize vFrom
 vTo = normalize vTo
 
 rotDot = dot vFrom vTo
 
 rotAngle = acos rotDot -- 角度は度
)

/*
 座標がノードの右側に位置するか判定

 nodeMtx ノードの行列
 pos 判定する座標
*/
fn IsRightSide nodeMtx pos =
(
 toPos = pos - nodeMtx.translation
 right = -nodeMtx.row1 -- ノードのRightベクトル
 
 d = dot right toPos
 if d > 0.0 do ( return true )
 return false
)

-- MAXWrapperのプロパティを変更するテスト
fn Test1 =
(
 -- ターゲット 
 target = mesh vertices:#([0,0,0],[10,0,40],[-10,0,40]) \
     faces:#([1,2,3]) materialIDS:#(1)
 target.pos = [-25, 75, 0]
 target.name = "Target"
 
 -- オブジェクトの作成
 -- 三角形のメッシュを作成
 tri = mesh vertices:#([0,-20,0],[10,10,0],[-10,10,0]) \
     faces:#([1,2,3]) materialIDS:#(1)

 -- オイラー角を作成
 rotAngle = eulerAngles 0.0 0.0 -45.0

 -- 回転の変更
-- tri.rotation = rotAngle as quat

 -- 位置の変更
 tri.pos = [0, 0, 0]

 -- スケールの変更
 tri.scale = [1, 2, 1]

 -- 選択状態の変更
 tri.isSelected = true

 -- ノードの行列
 format "mtx %\n" tri.transform
 
 -- ノードのローカルのZ方向
 format "dir %\n" tri.dir
 
 -- オブジェクトからターゲットまでのベクトル
 vToTarget = target.pos - tri.pos
 
 -- オブジェクトの進行方向
 vFwd = -tri.transform.row2
 
 -- ターゲットに向ける角度を取得
 rotAngle = GetAngle vFwd vToTarget
 format "rotAngle %\n" rotAngle
 
 -- ターゲットの座標がオブジェクトの右側か判定
 isRight = IsRightSide tri.transform target.pos
 format "isRight %\n" isRight
 
 if isRight == false do ( rotAngle = -rotAngle )
 
 -- オブジェクトの正面がターゲットを向くように回転させる
 rotAngle = eulerAngles 0.0 0.0 rotAngle
 tri.rotation = rotAngle as quat 
)

Test1()

0 件のコメント:

コメントを投稿