2012年7月29日日曜日

maxScriptで行列を勉強してみた④

今回は、逆行列を使い、基底をワールドとローカル変換し合って座標を変換していく。
こうすることで、あるオブジェクトのローカル情報を元に座標変換する事ができる。
要は別の基底(基準)を元に調整できる事ができるということである。
3dsmaxでいう下の赤枠を切り替えて調整するときあるけど、ここイメージすると良いかな。



















実例1 マトリックスを使い、ボックスのある頂点を、ティーポットのある頂点へ移動する。

1、ボックスとポットを用意する。頂点番号50をターゲットにする。
ボックスの絶対座標はワールド基底からの値で、ローカル座標はローカル基底からの値である。
ボックスのワールド基底をポットのローカル基底に変換するために下記の2つの基底を用意する。
ボックスのワールド基底の変換行列は、transformプロパティでゲットできる。
ポットのローカル基底が必要なので、逆行列で用意しておく。





2、ティーポットのローカル空間でのボックスの頂点50の座標を求める。そのためには、ボックスの基底をティーポットのローカル空間にすればよい。


3、ポットの頂点100のローカル空間座標を求め、ボックスの頂点50へ移動するため移動ベクトルを求める。



4、後は、3で求めたベクトルをmoveメソッドで頂点100に引数として渡してやるだけだ。














実例2 オブジェクトAのローカル空間を元に、オブジェクトBを動かす。

画像のboxのローカル空間を元にSphereを移動します。ここでは、boxのy軸に沿って移動したいと思います。
①変換マトリクスを用意します。
transmatrix [0,5,0]    ----①
これを$Sphere.transform * transmatrix [0,5,0]してもワールド空間でのY軸に沿っての移動になる。

②boxのローカル空間を取得する
inverse $box.transform    ----②
③①の移動変換マトリクスを②を使い変換する
xformmat ① ②
これでboxのローカル空間でのY軸に沿っての移動になる。












0 件のコメント:

コメントを投稿