/*
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()
2012年2月11日土曜日
MAXScript ノードのプロパティを変更
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿