myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | mCopyNormals

ポリゴンメッシュは別になっているけど、法線で繋がっているように見せられるんですね。

これはポイントの法線をコピぺーすればいいだけです。

これはもちろん1ポイントなら楽勝なんですけど、複数のポイント * 複数のオブジェクト * 複数のキャラになるとめちゃめちゃ面倒な作業になってしまいます。


なので、スクリプトを書いてみました。

ポイント法線をコピペーしてくれるスクリプトです。


使い方は:


コピー先のオブジェクトを選択(複数OK)してから、コピー元のオブジェクトを最後に選択する。 
最後に選択されたオブジェクトはコピー元になるので、選択順番に注意して下さい。 
(例:AとBとC を選択すると、Cの法線はAとBにコピーされます)
ポイント選択モードに変えて、法線コピーペーしたいポイントを適当に選んで、スクリプト実行。
ポイントは同じ位置になっている場合、法線はコピーされます。

全ポイントを選んでも良いけど、無駄な計算が増えるだけです。


場合によってポイント数が結構多くなるのでプログレッションバーも付けておきました。


mCopyNormals.gif


mCopyNormals
DOWNLOAD


全然大したこと書いてないから解説なしで。


注意: 
この法線コピペーツールはノーマルクラスターを作成します。
そして、Immed モードでノーマルクラスターを作成するとウェイトが効かなくなってしまいます。

/*-------------------------------------------------------
mCopy Normals
---------------------------------------------------------
myara | 2012/05/31

Copies normals from one object to another if their points are overlapping

- Select the target object(s), and add the source object to that selection
Warning : the last selected object will be the source.
- Roughly select the points you want to copy. It doesn't need to be an acurate selection
- Run the script

ポイントの法線をコピーするツールです。

コピー先のオブジェクトを選択(複数OK)してから、コピー元のオブジェクトを最後に選択する。
最後に選択されたオブジェクトはコピー元になるので、選択順番に注意して下さい。
(例:AとBとC を選択すると、Cの法線はAとBにコピーされます)
ポイント選択モードに変えて、法線コピーペーしたいポイントを適当に選んで、スクリプト実行。
ポイントは同じ位置になっている場合、法線はコピーされます。
-------------------------------------------------------*/

CopyNormals()

function CopyNormals(){
if (selection(0).type == "pntSubComponent"){
if (selection.count > 1){
//==================================================================
// Setup ProgressBar
//------------------------------------------------------------------
var moto = selection(selection.count - 1).subcomponent.componentcollection.count
var pointcount = 0
for ( var i=0, a = Selection.Count -1; i < a; i++ ) {
pointcount += moto * selection(i).subcomponent.componentcollection.count
}

var oPbar = XSIUIToolkit.ProgressBar ;
oPbar.Maximum = pointcount ;
oPbar.Step = 1;
oPbar.CancelEnabled = true ;
oPbar.Caption = "Evaluating Points";
oPbar.Visible = true;
//==================================================================

var sourceObj = selection(selection.count -1).subcomponent.parent3dobject
var sourceCol = selection(selection.count -1).subcomponent.componentcollection
for ( var i=0, a = sourceCol.Count; i < a; i++ ) {

oPbar.Increment() ;
var sourcePos = XSIMath.MapObjectPositionToWorldSpace(sourceObj.Kinematics.Global.Transform, sourceCol(i).Position);

for ( var j=0, b = selection.Count -1; j < b ; j++ ) {
var targetObj = selection(j).subcomponent.parent3dobject
var targetCol = selection(j).subcomponent.componentcollection

for ( var k=0, c = targetCol.Count; k < c ; k++ ) {

var targetPos = XSIMath.MapObjectPositionToWorldSpace(targetObj.Kinematics.Global.Transform, targetCol(k).Position);
if (mRound(targetPos.x) == mRound(sourcePos.x) && mRound(targetPos.y) == mRound(sourcePos.y) && mRound(targetPos.z) == mRound(sourcePos.z)){
CopyUserNormals(sourceCol(i))
PasteUserNormals(targetCol(k), false);
}
//================================================
if ( oPbar.CancelPressed ) return;
oPbar.Increment() ;
//================================================
}
}
}
oPbar.Visible = false ;
}
else{
logmessage ("オブジェクトを2つ以上を選択して下さい", siError)
}
}
else{
logmessage ("ポイントを選択して下さい", siError)
}
}

function mRound(oObj, dec){ // Round number
if (!dec){dec=4}
var dig = Math.pow(10,dec); return Math.round(oObj * dig)/dig
}

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/128-4d160540
Use trackback on this entry.

まとめtyaiました【SI | mCopyNormals】

ポリゴンメッシュは別になっているけど、法線で繋がっているように見せられるんですね。これはポイントの法線をコピぺーすればいいだけです。これはもちろん1ポイントなら楽勝なん...

  • 2012/05/31(木) 23:36:25 |
  • まとめwoネタ速neo