2010年10月5日火曜日

[MEL]法線を転写する

Normalcopy00
 
 
同一頂点数の2つのジオメトリ間で、法線情報のみ
コピーペーストする手法を探したがなかったので、
簡単なMELを作成してみた。
コピー元→コピー先の順にモデルを選択しMELを
実行すると法線が転写される。
 
 
作成意図は、最近のアニメ的表現でよく用いられている、
膨らませたモデルの法線を転写する事によって陰影を
簡略化する手法を実現するため。
 
Normalcopy01
 
作成したMELは以下。
 
 
 
// 法線の転写実験
//
// 変数定義
string $objname[]; // 選択オブジェクト名
int $vertexNo[]; // オブジェクトのバーテックス数
float $normalX[]; // 法線X
float $normalY[]; // 法線Y
float $normalZ[]; // 法線Z



// 選択オブジェクトの取得と頂点数カウント
$objname = `ls -sl`;
$vertexNo = `polyEvaluate -v $objname[0]`;



// 法線情報の取得と転写
for ($i=0 ; $i<$vertexNo[0] ; $i++)
{
// 取得情報を初期化
clear $normalX;
clear $normalY;
clear $normalZ;
// 最初に選択したオブジェクトの法線を取得
$normalX = `polyNormalPerVertex -q -x ($objname[0] + ".vtx[" + $i + "]")`;
$normalY = `polyNormalPerVertex -q -y ($objname[0] + ".vtx[" + $i + "]")`;
$normalZ = `polyNormalPerVertex -q -z ($objname[0] + ".vtx[" + $i + "]")`;
// 2番目に選択したオブジェクトに法線をペースト
polyNormalPerVertex -xyz $normalX[0] $normalY[0] $normalZ[0] ($objname[1] + ".vtx[" + $i + "]");
}
 
 
 
 
実験的に作成したものなので、実用化するには
以下のような状況への対応が最低限必要と思われる。
 
・3つ以上のオブジェクトが選択された場合の処理
・オブジェクト間で頂点数が違った場合の処理
・1頂点に複数法線がある場合(共有法線でない場合)

 
作成してみるとこの処理、法線情報の平均化という手法が
いわゆるNormalMapの使用意図の間逆である点が面白いと思った。



0 件のコメント:

コメントを投稿