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

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

前回の続きで、さらに座標変換マトリクスを生成するメンバ関数SetRotHPB()。XYZ軸同時に指定ができます。

ではオブジェクトをワールドの原点に配置して(回転/スケールは無しで)次のスクリプトを実行。

/*
SetRotHPB()テスト
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") + "]";
}

PrintMatrix(m)//マトリクスの表示
{
  if(!instanceof(m , Matrix))return;//マトリクスクラス以外は中断

  //マトリクスの表示
  println("v0 : " , VecString(m->GetV0()));
  println("v1 : " , VecString(m->GetV1()));
  println("v2 : " , VecString(m->GetV2()));
  println("v3 : " , VecString(m->GetV3()));
}

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

  var mg = op->GetMg();//オブジェクトのグローバルマトリクスを取得
  var m = new(Matrix);//新規のマトリクスの取得
  var hpb = vector(Radians(30.0) , Radians(40.0) , Radians(50.0));

  m->SetRotHPB(hpb);//hpb指定の変換マトリクスを生成
  mg = m->GetMulM(mg);//hpb指定した変換マトリクスでオブジェクトのマトリクスを変換

  op->SetMg(mg);//変換されたマトリクスをオブジェクトに適用

  //変換マトリクスmの表示
  println("*** SetRotHPB(30° , 40° , 50°) ***");
  PrintMatrix(m);
}

オブジェクトを配置したら、1回だけスクリプトを実行してほしい。
座標マネージャのHPBの値が30°40°50°に、なっています。一応、変換マトリクスをコンソールに表示しましたが、ぱっと見なんだかわからない数値になっています。SetRotX()等と同様v0が[0.0 , 0.0 , 0.0]に、なっています。
Matrix_12
このスクリプトは、複数回実行しても30°40°50°の倍数で増えるわけではありません。
HPBの値を操作しているわけではなく、マトリクスを変換してるからです。
気にせず次にいきましょう。
SetRotAxis()は回転軸方向と回転角度で変換マトリクスを生成します。先ほどのスクリプトを書き換えます。

/*
SetRotAxis()テスト
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") + "]";
}

PrintMatrix(m)//マトリクスの表示
{
  if(!instanceof(m , Matrix))return;//マトリクスクラス以外は中断

  //マトリクスの表示
  println("v0 : " , VecString(m->GetV0()));
  println("v1 : " , VecString(m->GetV1()));
  println("v2 : " , VecString(m->GetV2()));
  println("v3 : " , VecString(m->GetV3()));
}

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

  var mg = op->GetMg();//オブジェクトのグローバルマトリクスを取得
  var m = new(Matrix);//新規のマトリクスの取得

  m->SetRotAxis(vector(1.0 , 0.0 , 0.5) , Radians(5.0));//回転軸方向と回転角度を指定して変換マトリクスを生成
  mg = m->GetMulM(mg);//hpb指定した変換マトリクスでオブジェクトのマトリクスを変換

  op->SetMg(mg);//変換されたマトリクスをオブジェクトに適用

  //変換マトリクスmの表示
  println("*** SetRotAxis() ***");
  PrintMatrix(m);
}

オブジェクトを選択して実行してみてください。
コンソールの結果は、
Matrix_14_3
複数回実行すると、こんな感じです。
Matrix_13_2
変換用マトリクスの生成が今回の2個増えて、7個になりました。
数学が苦手でも、なんとなくMatrixが使えるような気がしてきましたね。

|

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

コメント

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