法線についての質問が某掲示板にあったので、解決するすべを考えてみました。
一つのオブジェクトの中に、法線の向きが反転してしまっている場合にそれを揃える問題です。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjer286iNoWTJ0tcPiXAJMuVR799M-FzF9LU9zDSx2UIFqfuWRykYLYq2cnVoo1Y5uBIO7w4KfuRrdjMlm2zHa0R2tVo5Y3dP7iAjvxTOWY1hPMC2Uah0VztWQhEb-VrPtN58ITxxd8FAY/s320/polynormal.jpg)
上の絵は、2つの Sphere を Merge して1つにして、真ん中の Polygon のみを反転させた状態です。
Border Line が見えますね。
真ん中だけ反転しているというものです。
このように、簡単な形状なら、真ん中の Polygon を選んで、Invert Polygons を実行すれば修正出来たことになりますが、ぐちゃぐちゃの場合、労力と気力と根性が必要です。
先ほど、Border Line が見えますとのことですので、ここで効力を発揮するのは、Polygon Island フィルターです。
Polygon Islandは、まさにポリゴンの島を選択するツールです。
これをセットして、F10を押し、Raycastモードにしてから、適当なPolygonをつつきます。
すると、下図のようになります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8GBL-MGj-dc8LNux-NsRyxv-ljfTRkeC3wxRp8WXesoVP-GMVZ15m8FtQVikX8E1IlXcssKcA_61QHzlNP65R7mxhJYcirJHLPrJDr6gjJlE3yTqWyEJhLWP1-GxKQ1UW72__yI37EA/s320/polyisland.jpg)
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))
一つのオブジェクトの中に、法線の向きが反転してしまっている場合にそれを揃える問題です。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjer286iNoWTJ0tcPiXAJMuVR799M-FzF9LU9zDSx2UIFqfuWRykYLYq2cnVoo1Y5uBIO7w4KfuRrdjMlm2zHa0R2tVo5Y3dP7iAjvxTOWY1hPMC2Uah0VztWQhEb-VrPtN58ITxxd8FAY/s320/polynormal.jpg)
上の絵は、2つの Sphere を Merge して1つにして、真ん中の Polygon のみを反転させた状態です。
Border Line が見えますね。
真ん中だけ反転しているというものです。
このように、簡単な形状なら、真ん中の Polygon を選んで、Invert Polygons を実行すれば修正出来たことになりますが、ぐちゃぐちゃの場合、労力と気力と根性が必要です。
先ほど、Border Line が見えますとのことですので、ここで効力を発揮するのは、Polygon Island フィルターです。
Polygon Islandは、まさにポリゴンの島を選択するツールです。
これをセットして、F10を押し、Raycastモードにしてから、適当なPolygonをつつきます。
すると、下図のようになります。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8GBL-MGj-dc8LNux-NsRyxv-ljfTRkeC3wxRp8WXesoVP-GMVZ15m8FtQVikX8E1IlXcssKcA_61QHzlNP65R7mxhJYcirJHLPrJDr6gjJlE3yTqWyEJhLWP1-GxKQ1UW72__yI37EA/s320/polyisland.jpg)
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
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
arrIslands.push(plyCurrIslands);
}
for(var i=0;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
コメント