ポリゴン法線
Softimageのスクリプトからポリゴンの法線を求めるときはどうすんだ?といういまさらな疑問です。
どうやらFacetCollectionにアクセスすると良いようでございます。そこにNormalArrayというプロパティがあるそうで。
ポリゴンを形成する頂点(Point)の持つ法線の平均でいいやと思って、ポリゴンノード(ActivePrimitive.Geometry.Polygons.Nodes)のNormalプロパティの平均を出そうとしました。これは、ビューポートの法線表示と同じものだから、下図のような平面となっているポリゴンの隣のポリゴンが傾いていると、その接線上の頂点の法線は当然傾いているから、平面となっているポリゴンの頂点の法線の平均をとると、傾いた値が出てきてしまうわけです。
というわけで、困っていたのですが、FacetCollectionのNormalArrayから取得してやれば何とかなりそうでした。
以下のスクリプトは各ノードの法線の値と、FacetCollectionにアクセスするとことで得られる法線の値と、それぞれのポリゴンのポイントとサンプルポイントのインデックスを出してみたものです。
app = Application log = app.Logmessage def nodeNomarl( oObj ): oPolys = oObj.ActivePrimitive.Geometry.Polygons vn = XSIMath.CreateVector3() for oPoly in oPolys: oNodes = oPoly.Nodes i = 0 for oNode in oNodes: vn = oNode.Normal log("Node %d: %f\t%f\t%f"%(oNode.Index, vn.X, vn.Y, vn.Z)) def polygonNormal( oObj ) : vn = XSIMath.CreateVector3() vy = XSIMath.CreateVector3( 0.0, 1.0, 0.0) oFacets = oObj.ActivePrimitive.Geometry.Facets oNormals = oFacets.NormalArray for i in range(oFacets.Count): vn.Set( oNormals[0][i] , oNormals[1][i], oNormals[2][i] ) log("Facet ID: %d --- %f\t%f\t%f"%( oFacets.IndexArray[i], vn.X , vn.Y, vn.Z )) log("dot product: %f"%vn.Dot( vy )) oPnts = oFacets[i].Points oSamples = oFacets[i].Samples pntsIndices = [] smpIndices = [] for oPnt in oPnts: pntsIndices.append(oPnt.Index) for oSmp in oSamples: smpIndices.append(oSmp.Index) log("Point Index: %s"%str(pntsIndices)) log("Sample Index: %s"%str(smpIndices)) oObj = app.Selection(0) nodeNomarl( oObj ) polygonNormal( oObj )
この結果が、例えば
# INFO : Node 0: 0.000000 1.000000 0.000000
# INFO : Node 1: 0.000000 1.000000 0.000000
# INFO : Node 5: 0.087156 0.996195 0.000000
# INFO : Node 4: 0.087156 0.996195 0.000000
# INFO : Node 2: 0.173648 0.984808 0.000000
# INFO : Node 3: 0.173648 0.984808 0.000000
# INFO : Node 7: 0.087156 0.996195 0.000000
# INFO : Node 6: 0.087156 0.996195 0.000000
# INFO : Facet ID: 0 --- 0.000000 1.000000 0.000000
# INFO : dot product: 1.000000
# INFO : Point Index: [0, 1, 5, 4]
# INFO : Sample Index: [0, 1, 4, 5]
# INFO : Facet ID: 1 --- 0.173648 0.984808 0.000000
# INFO : dot product: 0.984808
# INFO : Point Index: [3, 2, 4, 5]
# INFO : Sample Index: [2, 3, 6, 7]
というようになります。ちょっと賢くなったような気がします。
コメント |
コメントはありません。 |
コメントを投稿する |
ブログ作成者から承認されるまでコメントは反映されません |