日々適当

hibitekitou

ポリゴン法線

xsi |2015-01-16

 

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]

というようになります。ちょっと賢くなったような気がします。

コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。