« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか? | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?BaseObject->GetUpMg() »

数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?グローバルマトリクス

グローバルマトリクスを使って、ちょっとしたスクリプトです。

スクリプトを試すために数個のプリミティブオブジェクトを配置。全てのオブジェクトに「ファンクション」メニューの「ランダマイズ」で位置/回転/スケールを与えて空間に散らばしてください。位置/回転/スケールが、ばらばらに設定されているのを確認してください。後は、適当にオブジェクトを親子関係にしてください。
Matrix_04_2
それでは、どんなスクリプトか?
シーンに配置されているオブジェクトの位置に作業平面をシーンの先頭(オブジェクトマネージャの一番上)に作成します。ではスクリプト。

/*
選択したオブジェクトの位置に作業平面を配置
2008.12.28
*/


if(!op)return;//オブジェクトが選択されていなければ終了

var mg = op->GetMg();//選択したオブジェクトのグローバルマトリクスの取得
var obj = new(ConPlaneObject);//作業平面の作成

doc->InsertObject(obj , NULL , NULL);//作成した作業平面をオブジェクトマネージャのトップに追加
obj->SetMg(mg);//作業平面に選択したオブジェクトのグローバルマトリクスを適用

オブジェクトのグローバルマトリクスを取得し別のオブジェクトに適用するだけなので、数行のスクリプトですみましたね。
さて、適当にオブジェクトを選択してスクリプトを実行しよう。
選択したオブジェクトの位置に作業平面が配置されます。
Matrix_05
配置された作業平面を選択してみよう。
作業平面のスケールXYZそれぞれが、バラバラになっていると思う。このスケールは[1.0 , 1.0 , 1.0]が望ましいだろうから、一番最後に次を追加。

obj->SetScale(vector(1.0));//作業平面にスケール[1.0 , 1.0 , 1.0]を適用

追加したら先ほどと同じく、オブジェクトを選択しスクリプトを実行してみてください。
配置された作業平面のスケールは見事、[1.0 , 1.0 , 1.0]になっています。

ここでC.O.F.F.E.E.SDKのBaseObjectを見てみるとGetMgn()がある。
「ノーマライズされたオブジェクトのグローバルマトリクスが返ってくる。」とある。
ノーマライズだからマトリクスのv1,v2,v3の長さが1.0のグローバルマトリクスになるわけだ。
最後のSetScale()を削除し、上の方にある選択したオブジェクトのグローバルマトリクス取得のGetMg()をGetMgn()に変更。

/*
選択したオブジェクトの位置に作業平面を配置
2008.12.28
*/


if(!op)return;//オブジェクトが選択されていなければ終了

var mg = op->GetMgn();//<<<ここを変更。選択したオブジェクトのノーマルグローバルマトリクスの取得
var obj = new(ConPlaneObject);//作業平面の作成

doc->InsertObject(obj , NULL , NULL);//作成した作業平面をオブジェクトマネージャのトップに追加
obj->SetMg(mg);//作業平面に選択したオブジェクトのグローバルマトリクスを適用

これで、同じようにオブジェクトを選択し実行しなおすと…
追加された作業平面のスケールが[1.0 , 1.0 , 1.0]になっています。
ん?SetScale()で修正した作業平面と、GetMgn()で取得したマトリクスを適用した作業平面の軸が微妙にずれている。

SetScale()を適用した作業平面の回転
H  13.833 °
P  -2.388 °
B  -81.957 °
GetMgn()のマトリクスを適用した作業平面の回転
12.305 °
-2.708 °
-82.153 °

どうなってるんだ?
わかる人は教えてください。

|

« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか? | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?BaseObject->GetUpMg() »

コメント

この記事へのコメントは終了しました。