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

数学が苦手でも、C.O.F.F.E.E.のMatrixを使えるのか?Matrixクラス-5(ポリゴンの回転)

選択した1枚のポリゴンを回転する。
スクリプトの手順は…

ポリゴンの4点の平均がオブジェクトの軸の中心になるようにポリゴンを移動し、ポリゴンの法線を軸に回転。その後、元の位置に戻す。
今回はオブジェクト単体で簡潔するので、グローバル座標には変換しません。
変換マトリクスの生成
軸へ移動マトリクスは、SetTrans(-4点の平均)
回転マトリクスは、SetRotAxis(ポリゴンの法線 , 回転角)
元へ戻す移動マトリクスは、SetTrans(4点の平均)か、SetTrans(-4点の平均)のInvert()

/*
ポリゴンの4点の平均を中心にポリゴンを回転する
2008.12.29
*/


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

var pgc = op->GetPolygonCount();//ポリゴン数の取得
var pg_sel = op->GetPolygonSelection();//ポリゴンの選択状況を取得
if(pg_sel->GetCount() != 1)return;//ポリゴンの選択が1枚でなければ終了
var i;//カウンター
var pg_n , pg , pg_ave , pg_norm;//ポリゴン番号、ポリゴン、ポリゴンの平均、ポリゴンの法線
var pg_cord = new(array , 4);//ポリゴンの4点を格納
var tm = new(Matrix);//移動変換マトリクス用
var rm = new(Matrix);//回転変換マトリクス用


//選択ポリゴン番号の取得
for(i = 0 ; i < pgc ; i++){
  if(pg_sel->IsSelected(i))break;
}
pg_n = i;


pg = op->GetPolygon(pg_n);//選択ポリゴンの取得


//変換するため配列にポリゴンの4点を格納
pg_cord[0] = op->GetPoint(pg->a);
pg_cord[1] = op->GetPoint(pg->b);
pg_cord[2] = op->GetPoint(pg->c);
pg_cord[3] = op->GetPoint(pg->d);


//ポリゴンの4点の平均の計算
pg_ave = (pg_cord[0] +
          pg_cord[1] +
          pg_cord[2] +
          pg_cord[3]) / 4.0;


//ポリゴンの法線の計算(簡易)
pg_norm = vcross(pg_cord[2] - pg_cord[1] ,
                 pg_cord[0] - pg_cord[1]);


//ポリゴンを軸に移動
tm->SetTrans(-pg_ave);
for(i = 0 ; i < 4 ; i++){
  pg_cord[i] = tm->GetMulP(pg_cord[i]);
}


//ポリゴンを10°回転
rm->SetRotAxis(pg_norm , Radians(10.0));
for(i = 0 ; i < 4 ; i++){
  pg_cord[i] = rm->GetMulP(pg_cord[i]);
}


//ポリゴンを元の位置に戻す
tm->SetTrans(pg_ave);//tm->Invert();と同じ
for(i = 0 ; i < 4 ; i++){
  pg_cord[i] = tm->GetMulP(pg_cord[i]);
}


//配列に格納した変換ポイントをオブジェクトに戻す
op->SetPoint(pg->a , pg_cord[0]);
op->SetPoint(pg->b , pg_cord[1]);
op->SetPoint(pg->c , pg_cord[2]);
op->SetPoint(pg->d , pg_cord[3]);


op->Message(MSG_UPDATE);//オブジェクトの更新

ポリゴンを1枚だけ選択して実行してください。結果は
Matrix_20

|

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

コメント

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