<< RIB出力検証その4 戻る metasequoia Python RIB export >>

頂点法線 vertex normalを求める part2

metasequoia pythonで作ったスクリプトについて、以前書いた頂点法線の記事と比べてみる。今回は、三角形、四角形に分割し、頂点の数がたくさん増えてしまいます。mqo2ribでの求め方と似ているか?
各頂点ごと、重複していますが、RIBで以下を宣言しておけば良いかな。
フォン・スムースシェーディングになるのか?
検証してみます。metasequoia python楽しいね。

Declare "N" "facevarying normal"



以下は、メタセコイア Pythonでの頂点法線出力のサンプルです。

#norm04.py
import math
doc=MQSystem.getDocument()
out=MQSystem.println

def normalize(x,y,z):
s=math.sqrt(x*x+y*y+z*z)
if s==0.0:s=1
else: s=1.0/s
return x*s,y*s,z*s

def add(a,b):
return [ a[i]+b[i] for i in range(len(a)) ]

obj=doc.object[doc.currentObjectIndex]
out(str(obj.name))

count=obj.numFace
out("面の数:"+str(count))

v=[]
f=[]
for i in range(0,count):
v.append(obj.face[i].numVertex)

for j in range(0,obj.face[i].numVertex):
f.append(obj.face[i].index[j])


#v.reverse()
#f.reverse()

out(str(list(v)))
out(str(list(f)))


ten=[]
c={}
for k in range(0,obj.numVertex):
out(str(obj.vertex[k].pos.x)+", "+str(obj.vertex[k].pos.y)+", "+str(obj.vertex[k].pos.z))
ten.append((obj.vertex[k].pos.x,obj.vertex[k].pos.y,obj.vertex[k].pos.z))
c[k]=[]


for i in range(0,count):
#out("面のindex:"+str(obj.getFaceIndexFromUniqueID(i+1)))
#out("頂点数"+str(str(obj.face[i].numVertex)))

#out(str(faceid))
for j in range(0,obj.face[i].numVertex):
#out(str(obj.face[i].index[j])+":"+str(ten[obj.face[i].index[j]]))
x1=ten[obj.face[i].index[j-1]][0]
y1=ten[obj.face[i].index[j-1]][1]
z1=ten[obj.face[i].index[j-1]][2]
x2=ten[obj.face[i].index[j]][0]
y2=ten[obj.face[i].index[j]][1]
z2=ten[obj.face[i].index[j]][2]
#out("j+1 "+str(j+1))
if j+1==obj.face[i].numVertex:
x3=ten[obj.face[i].index[0]][0]
y3=ten[obj.face[i].index[0]][1]
z3=ten[obj.face[i].index[0]][2]
else:
x3=ten[obj.face[i].index[j+1]][0]
y3=ten[obj.face[i].index[j+1]][1]
z3=ten[obj.face[i].index[j+1]][2]
nx=(y2-y1)*(z3-z2)-(z2-z1)*(y3-y2)
ny=(z2-z1)*(x3-x2)-(x2-x1)*(z3-z2)
nz=(x2-x1)*(y3-y2)-(y2-y1)*(x3-x2)
if c[obj.face[i].index[j]]==[]:
c[obj.face[i].index[j]]=[-1*nx,-1*ny,-1*nz]
else:
c[obj.face[i].index[j]]=add(c[obj.face[i].index[j]],[-1*nx,-1*ny,-1*nz])
#out(str(c[obj.face[i].index[j]]))
#out(str(normalize(*c[obj.face[i].index[j]])))



for k in f:
out(str(k)+":"+str(normalize(*c[k])))


出力例

obj1
面の数:4
[3, 3, 3, 3]
[1, 3, 2, 1, 2, 0, 4, 5, 1, 4, 1, 0]
-50.0, 20.0, 0.0
50.0, 20.0, 0.0
-50.0, 0.0, 100.0
50.0, 0.0, 100.0
-50.0, 0.0, -100.0
50.0, 0.0, -100.0

頂点法線
1:(-0.0, 1.0, 0.0)
3:(0.0, 0.98058067569092011, 0.19611613513818402)
2:(0.0, 0.98058067569092011, 0.19611613513818402)
1:(-0.0, 1.0, 0.0)
2:(0.0, 0.98058067569092011, 0.19611613513818402)
0:(-0.0, 1.0, 0.0)
4:(-0.0, 0.98058067569092011, -0.19611613513818402)
5:(-0.0, 0.98058067569092011, -0.19611613513818402)
1:(-0.0, 1.0, 0.0)
4:(-0.0, 0.98058067569092011, -0.19611613513818402)
1:(-0.0, 1.0, 0.0)
0:(-0.0, 1.0, 0.0)

  • -
  • -

<< RIB出力検証その4 戻る metasequoia Python RIB export >>