« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-3 | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-5(ポリゴンの回転) »

数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-4

では、次にポリゴンオブジェクトのポイントを他のオブジェクトのローカル座標にします。
具体的には、ポリゴンオブジェクト(A)の選択した1個のポイントの座標を別のオブジェクト(B)のローカル座標としてヌルオブジェクトを配置します。

スクリプトの処理の手順は、
オブジェクト(A)のローカル座標をオブジェクト(A)のグローバルマトリクスでグローバル座標に変換します。
変換されたグローバル座標をオブジェクト(B)の反転されたグローバルマトリクスで変換するとオブジェクト(B)のローカル座標になります。

マトリクスの反転はInvert()を使います。

では、スクリプト

/*
選択された2個のオブジェクトの1個目の選択されたポイントのローカル座標を
2個目のオブジェクトのローカル座標に変換。その座標にヌルオブジェクトを配置
2008.12.29
*/


var obj1 = GetActiveObject(doc);//1個目の選択オブジェクトの取得
if(!obj1)return;//1個目の選択オブジェクトが無ければ終了
var obj2 = obj1->SearchNext(BIT_AOBJ);//2個目の選択オブジェクトの取得
if(!obj2)return;//2個目の選択オブジェクトが無ければ終了

var ptc = obj1->GetPointCount();//ポイント数の取得
var p_sel = obj1->GetPointSelection();//ポイント選択状況の取得
var i;//カウンター

//選択されたポイントが1個でなければ終了
if(p_sel->GetCount() != 1)return;

//選択されたポイント番号の取得
for(i = 0 ; i < ptc ; i++){
  if(p_sel->IsSelected(i))break;
}
var pt_n = i;

//グローバルマトリクスの取得
var gm_1 = obj1->GetMg();
var gm_2 = obj2->GetMg();

var p_pos = gm_1->GetMulP(obj1->GetPoint(pt_n));//選択ポイントのグローバル座標の取得
gm_2->Invert();//2個目の選択オブジェクトのグローバルマトリクスの反転
p_pos = gm_2->GetMulP(p_pos);//グローバル座標をローカル座標に変換

//ヌルオブジェクトの追加
var obj;
obj = new(NullObject);
doc->InsertObject(obj , obj2 , NULL);//選択された2個目のオブジェクトの個オブジェクトとしてシーンに追加
obj#NULLOBJECT_DISPLAY = 2;
obj->SetPosition(p_pos);

実行すると問題なくヌルオブジェクトが追加されます。
Matrix_19
今回覚えることは、グローバル座標をオブジェクトのローカル座標に変換の方法

オブジェクトのローカル座標 = オブジェクトの反転したグローバルマトリクス->GetMulP(グローバル座標)

|

« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-3 | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-5(ポリゴンの回転) »

コメント

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