« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-2 | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-4 »

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

さて、座標変換できるのは、マトリクスだけではありません。
ポイントとベクトルも座標変換できます。ん?「ポイントだって原点からのベクトルでしょう。」って思った人もいるかも知れませんね。両方とも同じベクトル型変数ですし。
ま、やってみよう。

まずはポイントを座標変換します。GetMulP()を使います。
Mulは掛け算(Multiplication)でPはPointだ。すなわちマトリクスとポイントの掛け算。
前回のGetMulM()はMはMatrix、GetMulV()のVはVectorだ。

次は、ポリゴンオブジェクトのポイント(ローカル座標)をコンソールにグローバル座標で表示。
ポイントデータはローカル座標で保存されています。それをある変換マトリクスを使ってグローバル座標に変換します。そのある変換マトリクスとは、オブジェクトのグローバルマトリクスです。
では、ポリゴンオブジェクトを適当に配置/回転させてください。
Matrix_15
プリミティブなら編集可能にしてください。

さてスクリプトを 実行。

/*
GetMulP()
ポリゴンオブジェクトのポイントのグローバル座標を表示
2008.12.29
*/


VecString(v)//ベクトル型変数を文字列に
{
  if(typeof(v) != DT_VECTOR)return;//ベクトル型以外は中断

  //x,y,zを小数点第3位までを文字列で返す
  return "[" + tostring(v.x , ".3f") +
       " , " + tostring(v.y , ".3f") +
       " , " + tostring(v.z , ".3f") + "]";
}



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


  var pts = op->GetPoints();//ポイントの取得
  var ptc = op->GetPointCount();//ポイント数の取得
  var gm = op->GetMg();//オブジェクトのグローバルマトリクスを取得
  var g_pt;//グローバルポイント用
  var i;//カウンター

  println("*** ローカル座標 ***");
  for(i = 0 ; i < ptc ; i++){
    println(VecString(pts[i]));
  }

  println("*** グローバル座標 ***");
  for(i = 0 ; i < ptc ; i++){
    g_pt = gm->GetMulP(pts[i]);
    println(VecString(g_pt));
  } 
}

結果は
Matrix_16
ローカル座標とグローバル座標が表示されました。
ポイントを1個づつ選択して、座標マネージャのオブジェクト/ワールドを切り替えて確認してください。同じになっているはず。自分は面倒なので次のスクリプトを実行しました。ただしポイント数の多いポリゴンオブジェクトを使ってテストしている人は注意が必要。
ポイントの位置にヌルオブジェクトをワールド直下に追加します。

/*
GetMulP()
ポリゴンオブジェクトのポイントのグローバル座標を表示し
ポイント位置にヌルオブジェクトを配置
2008.12.29
*/


VecString(v)//ベクトル型変数を文字列に
{
  if(typeof(v) != DT_VECTOR)return;//ベクトル型以外は中断

  //x,y,zを小数点第3位までを文字列で返す
  return "[" + tostring(v.x , ".3f") +
       " , " + tostring(v.y , ".3f") +
       " , " + tostring(v.z , ".3f") + "]";
}



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

  var pts = op->GetPoints();//ポイントの取得
  var ptc = op->GetPointCount();//ポイント数の取得
  var gm = op->GetMg();//オブジェクトのグローバルマトリクスを取得
  var g_pt;//グローバルポイント用
  var i;//カウンター

  println("*** ローカル座標 ***");
  for(i = 0 ; i < ptc ; i++){
    println(VecString(pts[i]));
  }

  println("*** グローバル座標 ***");
  for(i = 0 ; i < ptc ; i++){
    g_pt = gm->GetMulP(pts[i]);
    println(VecString(g_pt));
  }

  //ポイント位置にヌルオブジェクト
  var obj;
  for(i = 0 ; i < ptc ; i++){
    obj = new(NullObject);//ヌルオブジェクトを作成
    doc->InsertObject(obj , NULL , NULL);//ヌルオブジェクトをシーンに追加
    obj#NULLOBJECT_DISPLAY = 2;//円表示
    obj->SetPosition(gm->GetMulP(pts[i]));//位置をポリゴンオブジェクトのポイントのグローバル座標を適用
  }
}

結果はこのようになります。
ポリゴンオブジェクトが、子オブジェクトであろうと孫オブジェクトであろうと、どの階層に置いてあってもポリゴンオブジェクトのポイントのグローバルポイントを取得しヌルオブジェクトをワールド直下に配置します。

Matrix_17

このような事が理解できれば、他のポリゴンオブジェクトのポイントと比較したり適用したりできます。

今回覚えることは、

ポリゴンオブジェクトのポイントのグローバル座標 = オブジェクトのグローバルマトリクス->GetMulP(ポイントのローカル座標)

|

« 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-2 | トップページ | 数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-4 »

コメント

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