myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | Snap Points to Object

複数のオブジェクトを同時にいじっていると色々ずれていくんですよね。

そんな時にShrinkWrapという素晴らしいツールを使うと良いです。

ただですね、デフォルトだと、「Toward Inner Objectになってしまうから毎回「Closest Vertex」にしないと行けません。

オブジェクトを10個以上の場合は面倒だからこのスクリプトを作りました。


ポイント・エッジ・ポリゴンを選択して実行。
ピックカソルが出てきます
スナップしたいオブジェクトを選択して右クリック。


最初に選択したコンポネントがこのオブジェクトの一番近いポイントにスナップされます。

という単純なスクリプトなんですが、今日の作業に結構役に立ちました。

DOWNLOAD

SnapPnts2obj1.gif


ポイントがターゲットから離れすぎていると上手く行かない可能性があるので、その場合は手動で近づけてからスクリプトを実行して下さい。

if (selection.count >0){
if (selection(0).type=="pntSubComponent"||selection(0).type=="edgeSubComponent"||selection(0).type=="polySubComponent"){
var SelA = selection(0) // SubComponents
var SelAObj = SelA.Subcomponent.Parent3DObject // Obj0
// ポリメッシュをピックでObj1を取得
var rtn = PickElement(siPolyMeshFilter)
var SelB = rtn.Value("PickedElement") // Obj1
// ShrinkWrap
ApplyOp("ShrinkWrap", SelA +";"+ SelB, 3, siPersistentOperation, null, 0);
SetValue(SelAObj + ".polymsh.shrinkwrap.proj", 4, null);
// Freeze
FreezeShrinkWrap(SelAObj);
// Del PointCls
DelPointCls(SelAObj)
}
else{
logmessage("You need to select a sub-component", siWarning)
}
}

function FreezeShrinkWrap(oObj){ // Shrink Wrap オペレーターだけをフリーズ
oEnum = new Enumerator( oObj.ActivePrimitive.ConstructionHistory );
for (;!oEnum.atEnd();oEnum.moveNext()){
if ( oEnum.item().name == "Shrink Wrap"){
freezeobj(oEnum.item())
}
}
}

function DelPointCls(oObj){ // 自動に作られたポイントだけを削除
var pointcol = oObj.ActivePrimitive.Geometry.Clusters.Filter("pnt")
for (var i=0, a= pointcol.count ; i < a; i++){
if(pointcol(i).properties.count == 0){ // プロパティが0
if (pointcol(i).name.substr(0,10) == "Point_AUTO"){ // そして、念のために名前も確認してから
DeleteObj(pointcol(i)) //削除
}
}
}
}

Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/64-80574ffc
Use trackback on this entry.