2011年6月5日日曜日

AlignPlane v0.1

選択したコンポーネントを平面にそろえます
※フリーズ前提です

使い方

コンポーネントを選択

PICKセッションになるので、平面を作成


平面化しました。

JScript


//AlignPlane
//2011 05 14
//v0.1

main();
function main(){
 if(Selection(0).Count == 0)
  return
 var oSel = Selection(0);
 if(oSel.type == "polymsh"){ //ジオメトリを選択していた場合
  oObj = oSel
  oSub = oSel.ActivePrimitive.Geometry.Points.SubComponent
 }else if(oSel.Type == "edgeSubComponent" || oSel.Type == "polySubComponent"){
  oSub = oSel.SubComponent.ComponentCollection.NeighborVertices( 1 ).SubComponent;
  oObj = oSub.Parent3DObject;
 }else if(oSel.Type == "pntSubComponent"){
   oSub = oSel.subComponent;
  oObj = oSub.Parent3DObject;
 }else{
  return false;
 }
 FreezeModeling(oObj);
 Logmessage(oSub)
 oColl = oSub.ComponentCollection;

 //そろえるべき平面を作る 
 p0 = XSIMath.CreateVector3();
 p1 = XSIMath.CreateVector3();
 p2 = XSIMath.CreateVector3();

 Pick = pickPosition();
 if(!Pick(0))return;
 p0.set(Pick(1),Pick(2),Pick(3));
 Pick = pickPosition();
 if(!Pick(0))return;
 p1.set(Pick(1),Pick(2),Pick(3));
 Pick = pickPosition();
 if(!Pick(0))return;
 p2.set(Pick(1),Pick(2),Pick(3));
 
 v1 = XSIMath.CreateVector3();
 v2 = XSIMath.CreateVector3();
 nv = XSIMath.CreateVector3();
 
 v1.sub(p0,p1);
 v2.sub(p2,p1);
 nv.Cross(v1,v2);
 nv.NormalizeInPlace();
 
 //選択したコンポーネントのインデックスのアレイ
 IDArray = oColl.IndexArray.toArray();
 //Logmessage("IDArray " + IDArray);
 
 //オブジェクトの頂点のアレイ
 Pnts = oObj.ActivePrimitive.Geometry.Points;
 PosArray = Pnts.PositionArray.toArray();

 //ポイント移動用のベクトル
 mv = XSIMath.CreateVector3();

 
 for(var i = 0; i < Pnts.count; i++){
  for(var j = 0; j < IDArray.length; j++){
   if(i == IDArray[j]){
    //Logmessage("ID " + i + " point is Move")
    var pPos = L2W(oObj,Pnts(i).Position);
    var d = nv.Dot( p0 );//ポリ平面は p・n = d
    var dist = pPos.Dot( nv ) -d;  //符号距離は p・n-d
    mv.Scale( - dist, nv)
    pPos.addInPlace( mv );
    pPos = XSIMath.MapWorldPositionToObjectSpace( oObj.Kinematics.Local.Transform, pPos );
    
    //Logmessage(PosArray[i * 3] + " > " +  pPos.x);
    
    PosArray[i * 3]   = pPos.x;
    PosArray[i * 3 + 1]  = pPos.y;
    PosArray[i * 3 + 2]   = pPos.z;
   }
  }
 }
 Pnts.PositionArray = PosArray;
 return true; 
}

//Local to World
function L2W(inObj,inVect){
 v = inVect;
 m = XSIMath.CreateMatrix4();
 inObj.Kinematics.Global.Transform.getMatrix4(m);
 v.MulByMatrix4InPlace( m );
 return v;
}

以前、ツイッターで平面化の話が出たときには???
って感じでしたけど、仕事で必要だったので、作ってみました。

0 件のコメント:

コメントを投稿