2010/01/28

Softimage:PolygonIslandを使って、PolygonNormalを揃えてみた。

法線についての質問が某掲示板にあったので、解決するすべを考えてみました。
一つのオブジェクトの中に、法線の向きが反転してしまっている場合にそれを揃える問題です。



上の絵は、2つの Sphere を Merge して1つにして、真ん中の Polygon のみを反転させた状態です。
Border Line が見えますね。
真ん中だけ反転しているというものです。

このように、簡単な形状なら、真ん中の Polygon を選んで、Invert Polygons を実行すれば修正出来たことになりますが、ぐちゃぐちゃの場合、労力と気力と根性が必要です。

先ほど、Border Line が見えますとのことですので、ここで効力を発揮するのは、Polygon Island フィルターです。
Polygon Islandは、まさにポリゴンの島を選択するツールです。
これをセットして、F10を押し、Raycastモードにしてから、適当なPolygonをつつきます。
すると、下図のようになります。



Border のところで、選択が止まりました。
なので、これを Invert Polygons で反転してあげます。

というのを数回繰り返せば、向きを揃えることができますね。

数回繰り返すのもバカらしいという方は、スクリプトも作ってみました。
たぶん大丈夫だと思うのだけれど・・・。
今回は、Jscriptです。
バグあったら、教えてください。
あっ。ちなみに、オブジェクトの形状が複雑だと重いかも。
手動の方が良かったりするんですよね。



function GetIslands(in_obj)
{
  var arrIslands = new Array();
  var plyPolygons = in_obj.ActivePrimitive.Geometry.Polygons;
  var arrSeen = new Array(plyPolygons.Count);

  for ( var i=0; i    if(arrSeen[i]){continue;}
 
    var xsiCurrPolygons = new ActiveXObject("XSI.Collection");
    xsiCurrPolygons.Add(plyPolygons(i));

    var fltPolyIslandFilter = Filters("Polygon_Island");
    var xsiCurrIslands = fltPolyIslandFilter.Subset(xsiCurrPolygons);
 
    var plyCurrIslands = Dictionary.GetObject(xsiCurrIslands).SubComponent.ComponentCollection;
 
    for ( var j=0; j      arrSeen[plyCurrIslands(j).Index] = 1;
 
    arrIslands.push(plyCurrIslands);
  }

  for(var i=0;i    AlignNormal(arrIslands[i]);

  return arrIslands;
}

function AlignNormal(pIslandCol)
{
  var oCurPoly = new ActiveXObject("XSI.Collection");
  oCurPoly.Add(pIslandCol(0));
  var xsiCurrIslands = Filters("Polygon_Island").Subset(oCurPoly);
  ApplyTopoOp("InvertPolygon", xsiCurrIslands);
}

for(var i=0;i  GetIslands(Selection(0))

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...