Rendering学習日記

日々、3DCGの世界は進歩しています。勉強して理解したことをまとめていきます。RenderMan互換レンダラーやグローバル・イルミネーション。いろんなことに好奇心を持って、面白くなる。目指せShader書き!!
ありがとうございます。

mqo2rib(metared)

b2oxさん開発のRIBエクスポータ、webarchiveで探してダウンロードしました。
メタセコイアをRIBに変換しようとコマンドプロンプトから、打ったらエラー。
>mqo2rib.exe men_test.mqo

"men_test.mqo" is now loading and converting... Format Error at line 13, column 1 in "men_test.mqo".
complete! (Elapsed time: 0.0s)

検索したら、mqoファイル内にマテリアルが設定されていないからということがわかりました。メタセコイアで開いて、材質パネルで新規mat1を設けて上書き保存。こんどはできました。

3Delightでレンダリングしました。
mqo2rib.cfgをエディタで開き、コメントアウトを外す
RIB[:Renderer] = '3Delight'

付属のシェーダdistantlight2.slは、
shaderdl distantlight2.sl
でコンパイルしておきます。

レンダリングすると、下記のエラー
3DL ERROR P1107: [.../men_test.rib:27]: user p
arameter 'shadowname' has an unknown type

タイプを記述しておきました。
typeはshaderinfoでしらべるとわかります。

LightSource "distantlight2" 1
"uniform string shadowname" ["raytrace"]
"from" [0.236593 1.226111 -0.110574]
"uniform float shadowpower" [0.5]
"to" [0.000000 0.000000 0.000000]
"lightcolor" [1.000 1.000 1.000]
"uniform float blur" [0.03]
"uniform float samples" [10]

後、法線の計算で8点計算されて出力されました。
3DL WARNING P1104: [men_test_mdl.rib:13]:
array of 'normal's has wrong size, expected 18 'normal'(s), but given 24

"N" [0.000000 1.000000 -0.000000
0.000000 1.000000 -0.000000
0.000000 0.980581 -0.196116
0.000000 0.980581 -0.196116
0.000000 1.000000 -0.000000
0.000000 0.980581 0.196116
0.000000 0.980581 0.196116
0.000000 1.000000 -0.000000]

5行目
0.000000 1.000000 -0.000000
と8行目
0.000000 1.000000 -0.000000
を削除した。

レンダリングでエラーが出なくなった。

mqo2rib使ってみます。
ありがとうございます。
men_test.jpg
  • -
  • -

頂点法線 vertex normalを求める

PointsPolygonを求めたいので、各頂点の法線ベクトルを順に辞書に格納していき、空でなければ、加えていくようにしました。
最後に正規化をかけて、できあがり。グローシェーディングの求め方です。本来ならば、外積など関連するものはモジュール化してしまえばよいのですが、まだまだ修行がたりません。
出力したものをエディタ使ってRIBにしてみたら、面が表示されず、頂点indexの順番をreverse()したら、表示されました。理屈で攻めていかなければならないところですが、泥臭いところです。法線を求められたのは、ちょっとうれしいです。佐藤義雄先生の「実習グラフィックス」、メタセコイアマスターガイドを参考にしました。後、LilyEightのアプリBも参考になりました。PolygonからPointsPolygonにするRIB to RIBがあります。
先駆者の資料は役立ちます。
metasequoia python interfaceの中にホントはもっと簡単に求められる方法があるのかもしれません。
まだまだ自己満足なところですが、レンダリング結果はこんな感じでした。
catmull.jpg

サンプルスクリプトです。もう一歩前にすすみたいところです。ありがとうございます。
#norm03.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 range(0,obj.numVertex):
out(str(k)+":"+str(normalize(*c[k])))
  • -
  • -

UV座標のリストを表示する

coord UV座標のリスト
メタセコイアpythonを使って求める
これがst座標になるかはまた検証です。
勉強します。

doc=MQSystem.getDocument()
out=MQSystem.println

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

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

for face in obj.face:
faceid=list(face.index)

for x in range(0,count):
for y in range(0,obj.face[x].numVertex):
out(str(obj.face[x].index[y])+":"+str(obj.face[x].coord[y]))


出力結果
obj1
面の数:4
1:[0.9957, 0.4946]
3:[0.9957, 0.9754]
2:[0.5149, 0.9754]
1:[0.9930, 0.4892]
2:[0.5122, 0.9700]
0:[0.5122, 0.4892]
4:[0.5203, 0.0004]
5:[1.0011, 0.0004]
1:[1.0011, 0.4811]
4:[0.5203, 0.0058]
1:[1.0011, 0.4865]
0:[0.5203, 0.4865]
  • -
  • -
<< 24/40 >>