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

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

気づいた人もいると思いますが、ポリゴンも回転できたのだから、uvポリゴンも回転できるだろう。C4Dのuvポリゴンのポイントは2Dではなく3DのUVWだ。3Dなのだからオブジェクトのポイント同様Matrixで座標変換ができるはず。uvwのデータは、3Dベクトルのxyにあたるuvには値があるけど、zにあたるwが0.0になっている。まぁ0.0も値ではあるが…。回転はz軸。なので変換マトリクスを得るにはGetRotZ()でいいはずだ。ポリゴンの法線を求める必要は無いだろう。uvポリゴンの取得は前にテストしたので。ここでは、詳しくやりません。

/*
選択された1枚のUVポリゴンを回転
2008.12.30
*/


if(!op)return;//アクティブオブジェクトが無ければ終了

var at = GetActiveTag(op);//オブジェクトに取り付けられているタグのアクティブタグを取得
if(!instanceof(at , UVWTag))return;//アクティブタグがUVWタグでなければ終了

var pg_sel = op->GetPolygonSelection();//ポリゴンの選択状況の取得
if(pg_sel->GetCount() != 1)return;//ポリゴン選択が1枚でなければ終了

var pgc = op->GetPolygonCount();//ポリゴン数の取得
var uv_pg = at->GetData();//UVポリゴンの配列の取得
var uv_data_c = at->GetDataCount();//UVWタグのインデックス数を取得
var mp;//UVWタグのインデックスからuvポリゴン配列のインデックスへのマッピング用
var i;//カウンター
var pn;//変更するuvポリゴン番号
var ap = vector(0.0);//ポリゴン4点の平均
var tm = new(Matrix);//移動変換用マトリクス
var rm = new(Matrix);//回転変換用マトリクス
var tmr = new(Matrix);//移動変換用マトリクス

//選択された1枚のポリゴン番号を取得
for(i = 0 ; i < pgc ; i++){
  if(pg_sel->IsSelected(i))break;
}
pn = i;

//UVポリゴンの変更
if(!(pn < uv_data_c))return;//変更するuvポリゴン番号は範囲内で無ければ終了
mp = pn * 4;//マッピング

//uvポリゴン4点の平均
for(i = 0 ; i < 4 ; i++)ap = ap + uv_pg[mp + i];
ap = ap / 4.0;

tm->SetTrans(-ap);//uvw原点へ移動変換マトリクスの生成
rm->SetRotZ(Radians(10.0));//10°z軸回転変換マトリクスの生成
tmr->SetTrans(ap);//元の位置に戻す変換マトリクスの生成

//4点の平均を中心に回転
for(i = 0 ; i < 4 ; i++){
  uv_pg[mp + i] = tm->GetMulP(uv_pg[mp + i]);//原点へ移動
  uv_pg[mp + i] = rm->GetMulP(uv_pg[mp + i]);//回転
  uv_pg[mp + i] = tmr->GetMulP(uv_pg[mp + i]);//元へ移動
}

at->SetData(uv_pg);//UVWタグにuvポリゴン配列適用

一応、ポリゴンの選択を1枚に限定しました。オブジェクトとそれに取り付けられたUVWタグも選択してください。
実行するとuvポリゴンが10°回転します。
本格的に作りこむのであれば、ダイアログを付けて回転角度を入力したりできます。
選択された複数枚のuvポリゴンを回転させたりもできるでしょう。
複数枚の回転は、ポリゴン毎に回転軸を設定するか、まとめて1つの軸にするのか、隣接判定してグループ毎にするのかが考えられるでしょう。

|

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

コメント

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