1/1

RIB出力検証

メタセコイアPythonを使ってRIB出力ができるスクリプトができた。
視野変換では、ConcatTransformを求めた。
uvマップはきちんと出るようにした。右手系での出力になります。
men_new.jpg

以下はRIB出力。レンダリングは3Delightを使用しました。レイトレーシング設定しています。

##Renderman RIB-Structure 1.0
Display "men.tif" "file" "rgba"
Display "+men.tif" "framebuffer" "rgba"

Format 640 480 1
PixelSamples 4 4
PixelFilter "catmull-rom" 3 3
ShadingRate 1

Imager "background" "background" [0.200 0.400 0.600]

Sides 1
Orientation "rh"
Projection "perspective" "fov" [9.527]
ConcatTransform [
0.586877119816 -0.615504654203 -0.526050631489 0
0 0.649705095569 -0.760186351359 0
-0.809676013129 -0.446135976409 -0.381297055217 0
-14.6153686718 -5.38463034481 1500.00000696 1
]
Scale 1 1 -1
WorldBegin
Attribute "visibility" "trace" [1]
Attribute "visibility" "transmission" ["Os"]
Attribute "visibility" "transmission" "opaque"
Attribute "light" "shadows" "on"
Attribute "trace" "displacements" [1]
LightSource "ambientlight" 0 "intensity" [ 0.1 ] "lightcolor" [ 1 1 1 ]
LightSource "distantlight" 1 "intensity" [ 3 ] "lightcolor" [ 1 1 1 ] "from" [ -1 1 -1 ] "to" [ 0 0 0 ]
LightSource "distantlight" 2 "intensity" [ 3 ] "lightcolor" [ 1 1 1 ] "from" [ 1 1 2.5 ] "to" [ 0 0 0 ]
ReadArchive "men_uv_model2.rib"
WorldEnd




MakeTexture "grade.tif" "grade.tdl" "periodic" "periodic" "gaussian" 1 1
Surface "supertexmap" "string Csmapname" "grade.tdl"
AttributeBegin
Attribute "identifier" "name" ["obj1"]
Declare "st" "facevarying float[2]"
Scale 1 1 -1
PointsPolygons
[ 3 3 3 3 ][ 1 3 2 1 2 0 4 5 1 4 1 0 ]
"P" [-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
]
"N" [-0.0 1.0 0.0
-0.0 1.0 0.0
0.0 0.980580675691 0.196116135138
0.0 0.980580675691 0.196116135138
-0.0 0.980580675691 -0.196116135138
-0.0 0.980580675691 -0.196116135138
]
"st" [0.995700001717 0.494610011578
0.995700001717 0.975380003452
0.514930009842 0.975380003452
0.993009984493 0.489219993353
0.512239992619 0.96999001503
0.512239992619 0.489219993353
0.520319998264 0.000369999994291
1.00109004974 0.000369999994291
1.00109004974 0.481139987707
0.520319998264 0.00576000008732
1.00109004974 0.486530005932
0.520319998264 0.486530005932 ]
AttributeEnd


  • -
  • -

RIB出力検証その2

metasequoia pythonを使って、メタセコイアからモデルをRIB出力するプログラムを検証した。あれれ、面の向きがちょっと違いました。
モデルの部分、
AttributeBeginの後に
Scale 1 1 -1
を加えました。
mapnew.jpg

以下は、RIB出力です。レンダリングは3Delightを使用しました。

Display "maptest.tif" "file" "rgba"
Format 640 480 1
PixelSamples 2 2
PixelFilter "catmull-rom" 3 3
ShadingRate 1
MakeTexture "uvmap.tif" "uvmap.tdl" "periodic" "periodic" "gaussian" 1 1

Imager "background" "background" [0.2 0.4 0.6]

Sides 1
Orientation "rh"
Projection "perspective" "fov" [9.527]
ConcatTransform [
0.742768750199 -0.412412747762 -0.527456452431 0
0 0.787779841733 -0.615956914857 0
-0.669548044376 -0.457513547825 -0.585138248476 0
6.36650111119e-006 2.36958414916e-005 1500.00001648 1
]
Scale 1 1 -1
WorldBegin
Attribute "visibility" "trace" [1]
Attribute "visibility" "transmission" ["Os"]
Attribute "visibility" "transmission" "opaque"
Attribute "light" "shadows" "on"
LightSource "distantlight" 1
"from" [0.205154 1.226111 -0.161600]
"to" [0.000000 0.000000 0.000000]
"lightcolor" [0.800 0.800 0.800]
LightSource "ambientlight" 2
"lightcolor" [0.300 0.300 0.300]
AttributeBegin
Scale 1 1 -1
Surface "supertexmap" "string Csmapname" "uvmap.tdl"
Declare "st" "facevarying float[2]"
Attribute "identifier" "name" ["obj1"]
PointsPolygons
[ 4 ][ 0 1 3 2 ]
"P" [-100.0 0.0 -100.0
100.0 0.0 -100.0
-100.0 0.0 100.0
100.0 0.0 100.0
]
"N" [-0.0 1.0 -0.0
-0.0 1.0 -0.0
0.0 1.0 0.0
-0.0 1.0 -0.0
]
"st" [0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 ]
AttributeEnd
WorldEnd

  • -
  • -

RIB出力検証その3

ということで、メタセコイアのサンプルモデルmekaをRIB出力。metasequoia pythonを使って視野変換してConcatTransformを求める。
エディタ使って、以下のように書きました。3Delightでレンダリングできるように設定してあります。レイトレーシング設定で影もでます。
ここまでくる道のりは長かった。できるとうれしいです。
mekanew.jpg
ありがとうございます。わくわくしてきた。楽しいね。

以下はRIBです。長すぎですので、下からダウンロードして3Delightでレンダリングしてみてください。。


Display "mekatest.tif" "file" "rgba"
Format 640 480 1
PixelSamples 2 2
PixelFilter "catmull-rom" 3 3
ShadingRate 1
MakeTexture "00tex_master.tif" "00tex_master.tdl" "periodic" "periodic" "gaussian" 1 1

Imager "background" "background" [0.2 0.4 0.6]

Sides 1
Orientation "rh"
Projection "perspective" "fov" [48.728]
ConcatTransform [
0.912762334333 -0.256856235992 -0.317631539769 0
0 0.777572864472 -0.628792843818 0
-0.408491029306 -0.573938423935 -0.709739222889 0
-14.5441391986 -308.526077317 1143.67912849 1
]
Scale 1 1 -1
WorldBegin
Attribute "visibility" "trace" [1]
Attribute "visibility" "transmission" ["Os"]
Attribute "visibility" "transmission" "opaque"
Attribute "light" "shadows" "on"
LightSource "distantlight" 1
"from" [0.205154 1.226111 -0.161600]
"to" [0.000000 0.000000 0.000000]
"lightcolor" [0.800 0.800 0.800]
LightSource "ambientlight" 2
"lightcolor" [0.300 0.300 0.300]

AttributeBegin
Scale 1 1 -1
Surface "supertexmap" "string Csmapname" "00tex_master.tdl"
Declare "st" "facevarying float[2]"
Attribute "identifier" "name" ["body01"]
PointsPolygons
[ 4 4 4 4 4 4 4 4 4 4 3 4 4 3 3 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 3 4 3
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 3
3 4 4 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4
4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 3 3 4 4 3 3 3 3 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3
3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 3 3 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 4 4 4 4 4 4 4 4 3 3 4 4 3 3 3 3 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 4 4 4 4 4
4 4 4 4 4 4 4 4 4 ][ 8 1 3 9 8 9 2 0 10 5 7 11 10 11 6 4 17 15 5 10 16 13 15 17
14 17 10 4 12 14 4 2 16 12 2 9 16 17 14 12 6 19 4 7 18 20 11 11 20 19 6 2 4 19
2 19 0 22 24 18 1 23 22 1 8 24 26 20 18 24 22 23 26 21 23 8 0 25 21 0 19 26 25
19 20 26 23 21 25 28 16 9 27 13 16 28 27 28 9 3 13 27 5 15 7 5 27 18 27 3 1 18
29 30 32 31 31 32 34 33 38 29 31 33 35 38 33 37 30 29 38 34 37 36 30 37 34 32
39 40 42 41 41 42 44 43 43 44 46 45 45 46 48 47 47 48 50 49 49 50 40 39 40 50
48 42 42 48 46 44 49 39 41 47 47 41 43 45 53 54 52 51 55 56 54 53 57 58 56 55
59 60 58 57 61 62 60 59 51 52 62 61 54 60 62 52 56 58 60 54 59 53 51 61 57 55
53 59 68 67 66 65 68 65 64 68 64 63 69 71 70 66 67 74 75 76 77 73 74 77 78 72
73 77 76 75 79 80 65 66 75 74 67 68 77 76 68 69 78 77 69 63 72 78 71 67 76 80
70 71 80 79 83 84 86 85 85 86 88 87 82 89 90 81 89 84 83 90 84 89 82 81 90 83
85 87 81 83 84 82 88 86 91 92 94 93 95 96 98 97 97 98 100 99 99 100 92 91 92
100 98 94 102 101 93 94 104 102 94 96 103 104 96 95 101 102 104 103 94 98 96 93
106 105 91 97 108 107 95 99 109 108 97 91 105 109 99 106 108 109 105 106 93 101
110 107 106 110 111 95 107 111 103 103 111 110 101 107 108 106 112 113 115 114
.....................................省略....................
AttributeEnd
WorldEnd



ダウンロードはこちら
mekatest.rib
  • -
  • -

RIB出力検証その4

metasequoia pythonから出力したRIBは、頂点法線も計算して出力しているので、スムージングがかかっている。
RIB内の"N"[・・・]で始まる部分をすべて削除してレンダリングすると、かくっとしたモデルになります。
以下は、3Delightでレンダリングしました。速いです。
mekatest_n.jpg
  • -
  • -

頂点法線 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)

  • -
  • -

1/1