« C.O.F.F.E.E.でUVWタグにアクセス-1.準備 | トップページ | C.O.F.F.E.E.で選択されたuvポリゴンを縮小 »

C.O.F.F.E.E.でUVWタグにアクセス-2スクリプト

前回、準備したオブジェクトのUVWタグにアクセスしてみよう。

Uvw_tag_scan
BP UV Editで展開したのでテクスチャタグが増えました。
まずは、オブジェクトに取り付けられてる選択されているUVWタグを取得してみよう。

/*
選択したオブジェクトのアクティブなUVWタグを取得
2008.12.25
*/


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

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

println(at->GetName());//取得したタグの名前をコンソールに表示

言うまでもないでしょうが、実行前にオブジェクトを選択してUVWタグ1個だけ選択してください。
結果は…

UVW

オブジェクトが選択されてなかったり、UVWタグが選択されていなければ処理は中止します。
それでは、UVWの中身のデータを見てみましょう。

/*
UVWタグのデータを表示
2008.12.25
*/


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

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

var uv_pg = at->GetData();//UVポリゴンの配列の取得
var uv_data_c = at->GetDataCount();//UVWタグのインデックス数を取得
var mp;//UVWタグのインデックスからuvポリゴン配列のインデックスへのマッピング用
var i , j;//カウンター


//UVWデータの表示
println(op->GetName() , "***" , at->GetName());//オブジェクトの名前とUVWタグの名前を表示
for(i = 0 ; i < uv_data_c ; i++){//UVWタグのインデックスの数だけ繰り返す
  mp = i * 4;//マッピング
  print(i , " : ");//UVWタグのインデックスの表示
  for(j = 0 ; j < 4 ; j++){//UVポリゴンの4点の座標
    print(uv_pg[mp + j]);//ポイント座標の表示
  }
  println("");//改行のため
}

さて実行してみよう。もちろんオブジェクトとUVWタグを選択した状態でですよ。結果は…

Uvw_data_3

では、構造タグのUVW座標モードでのデータを見てみよう。
Uvw_data_4
少し見づらいのですが、小数点第4位で四捨五入されています。
このスクリプトからもわかるように、オブジェクトのポリゴンと同じようにポリゴンnのa,b,c,dと言う順番で格納されています。オブジェクトのポリゴンと違うのは、UVWタグの場合は座標がそのままベクトル型で格納されています。
Uvwdatas 
このベクトル数値を変更してUVWタグに適用すればUVポリゴンを変更することが可能ということになります。

UVポリゴン3番を小さくしてみよう。

/*
UVWタグのデータを変更
2008.12.25
*/


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

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

var uv_pg = at->GetData();//UVポリゴンの配列の取得
var uv_data_c = at->GetDataCount();//UVWタグのインデックス数を取得
var mp;//UVWタグのインデックスからuvポリゴン配列のインデックスへのマッピング用
var i;//カウンター
var pn = 3;//変更するuvポリゴン番号
var sc = 0.5;//スケール0.5
var ap = vector(0.0);//ポリゴン4点の平均

//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;

//4点の平均を中心に0.5倍にする
for(i = 0 ; i < 4 ; i++)uv_pg[mp + i] = (uv_pg[mp + i] - ap) * sc + ap;

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

結果は、BP UV Editで確認。
Uv_mesh_2

後は、uvポリゴンやuvポリゴンのポイント(オブジェクトのポイントではなく)の選択関連は、どうするんだろう?SDKをざっと見たけどuvポリゴンなどの選択状況を得る方法が見当たらなかったなあ。uvポリゴンを選択するとオブジェクトのポリゴンが選択されるから、オブジェクトのGetPolygonSelection();でポリゴン番号を取得できるけど。ポイントはどうするんだ?uvポリゴンのポイントを選択したらオブジェクトのポイントも選択されるけど、GetPointSelection()で取得できるのはポイント番号のみで、どのポリゴンのa,b,c,d,のどれかは分からないなあ。

|

« C.O.F.F.E.E.でUVWタグにアクセス-1.準備 | トップページ | C.O.F.F.E.E.で選択されたuvポリゴンを縮小 »

コメント

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