<< 2/6 >>

メタセコイア マテリアル一括設定???

metasequoia python を使ってマテリアルの一括設定をやろうとした。
やはり、反射の強度は反映されません。材質パネルを確認すると、反射光specularに数値が渡されています。
参考スクリプト いくつか材質を設定しておいて、powerを一括変更するスクリプト(変更しないので勉強中)

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

for mat in doc.material:
if not mat:continue
out(mat.name)

num = doc.numMaterial
for x in range(0,num):
mat = doc.material[x]
if mat is None: continue
if mat.power == 5.0:
mat.power = 0.8
elif mat.power == 100.00:
mat.power = 2.0
else:
mat.power = 0.9

for x in range(0,num):
mat = doc.material[x]
if mat is None: continue
out(str(mat.power))

  • -
  • -

正二十面体を並べてみる。

マテリアルの設定を一括で、ガラス質感にした。Pythonスクリプトを使ってみたが、出力された反射の強さpowerはデフォルトの5のままで、0にならない。メタセコイアで平面を入れて、三角形化して、Parthenon Rendererでレンダリングしました。
icosa09.jpg
さらに、勉強ですね。ありがとうございます。
  • -
  • -

正二十面体を並べてみる その2

Metasequoia Pythonを使って正二十面体を81個並べた。Parthenon Rendererでレンダリングできた。
ガラスの質感を設定した。
icosa81.jpg
  • -
  • -

メタセコイア マテリアル一括設定 その2

metasequoia pythonでマテリアルの一括設定がpowerの部分がうまくいかないので、ちょっと考えてみた。保存したmqoファイルはテキスト形式なのだから、Pythonのテキスト処理で何とかなるか。以下のようにエディタでもできる置き換えをPythonで実行した。

#power01.py
name="box_test"
name2="box_test2"
filename=name+".mqo"
f=open(filename,'r')
filename2=name2+".mqo"
g=open(filename2,'w')
a=f.read()
a1=a.replace('power(5.00)','power(100.00)')
g.write(a1)
f.close()
g.flush()
g.close()

上の記述ではbox_test.mqoを読み込んで置換している。コマンドプロンプトから、
>python power01.py
と、打ち込んで実行した。pythonはver2.6をインストールしている。
なお、床面までpower(100.00)としたら、Parthenon rendererはレンダリング中に応答なしになった。強制終了させた。床はちょっと控えめにメタセコイアから材質パネルを開いて、後で調整した。

調整前
box_test.jpg
調整後、面は鏡のように映り込みした。
box_test2.jpg

アイデア次第でいろいろできますね。ありがとうございます。
  • -
  • -

メタセコイアpython 立方体生成その4

立方体を576個生成、乱数で高さを調整、マテリアルにメタリックを加える。Parthenon Renderでレンダリングした。
なお、反射強度は別でPythonでテキスト処理を行った。
boxmetal04.jpg
以下はサンプルスクリプトです。実行後、地面や壁を加え、ポリゴンは三角化してます。

import random

def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return

for arg in args:
MQSystem.println(str(arg))


# 基本図形、新規オブジェクトで立方体複数つくる その2
#drawCube_def_metal.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0 頂点番号
obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )

mat1=MQSystem.newMaterial()
doc.addMaterial(mat1) #マテリアルをドキュメントに追加
num0 = doc.numMaterial #現在の材質数を数える
numm=num0-1 #マテリアル番号は一つ少ない

doc.material[numm].color.red=num0*0.00346
doc.material[numm].color.green=0.1
doc.material[numm].color.blue=1-num0*0.00346
doc.material[numm].alpha=1.0
doc.material[numm].diffuse=1.0
doc.material[numm].ambient=0.0
doc.material[numm].emissive=0.0
doc.material[numm].specular=1.0
for face in obj.face:
face.material=numm #マテリアルnumm番を面に割り当てる


import traceback
import sys
cnt=0
try:
for dist in range(0,1400,60):
for dist2 in range(0,1400,60):
cnt=cnt+1
#out(str(dist))
unitcube(40,dist-700,20+random.gauss(0,8),dist2-700)


out(str(cnt))
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
  • -
  • -

メタセコイアでPython練習 テキスト処理

metasequoia pythonスクリプトで、基本となるファイルの書き出しをやってみました。テキストファイルですが、はじめの一歩となります。
リストa=['mother','other','test']をadd.txtというファイルに改行して保存します。スクリプト実行時にリストの個数を数えて、表示するようにしています。ファイル出力の基礎基本、大切ですね。さらに勉強します。

def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return

for arg in args:
MQSystem.println(str(arg))


#meta_text.py リストを作成し、保存する。
doc = MQSystem.getDocument()


out = MQSystem.println

import traceback
import sys
try:
a=['mother','other','test']
b=len(a)
for i in range(b):
out(str(a[i]))
o=open('add.txt','w')
for x in a:
o.write(x+'\n') #改行を加える
o.close()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))

  • -
  • -

ポリゴン面の求め方 python cgkitを利用

python cgkitを利用、外積と正規化ですね。
エクセル使って、地道に求めていたけど、pythonわかってくると面白い。
うまく組めるようになれればしめたもの。
まだまだ勉強足りません。

from cgkit.all import *
from cgkit.cgtypes import *

a0=vec3(0.000000, 0.000000, 0.000000)
a1=vec3(0.500000, 0.000000, -0.250000)
a2=vec3(0.500000, 0.450000, -0.250000)
a3=vec3(0.000000, 0.450000, 0.000000)

v10=a1-a0
v20=a2-a0
v30=a3-a0

n0=v10.cross(v20)
n02=v20.cross(v30)
n00=n0+n02
print n00.normalize()


ここ,参考になりました。
http://ft-lab.ne.jp/cgi-bin/wiki.cgi
ありがとうございます。
  • -
  • -

面法線と頂点法線

前回の記事のリンク先を参考に、頂点法線を求めてみた。とんでもなく面倒だけど、考え方がちょっとわかりました。

以下は、cgkitを利用してベクトルを求め、外積、そして正規化を行った。
メタセコイアでモデルを作り、各頂点の法線をRIBエクスポートするPolyconv(cnv)やmtrで出してみた。
normal01.jpg

C:\Python26>python
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.

cgkit起動

>>> from cgkit.all import *


頂点座標を入力
>>> a0=vec3(50,20,0)
>>> a1=vec3(50,0,-100)
>>> a2=vec3(-50,0,-100)
>>> a3=vec3(-50,20,0)
>>> a4=vec3(-50,0,100)
>>> a5=vec3(50,0,100)

----------------------------
a1の頂点法線を求める
ベクトル算出
>>> v1=a0-a1
>>> v2=a2-a1
外積 反時計回り
>>> n0=v2.cross(v1)
a1の頂点法線
>>> a1n=n0.normalize()
>>> a1n
(0, 0.980581, -0.196116)

-----------------------------
a2の頂点法線を求める
>>> v1=a1-a2
>>> v2=a0-a2
外積 反時計回り
>>> n0=v2.cross(v1)

>>> v1=a0-a2
>>> v2=a3-a2
外積 反時計回り
>>> n1=v2.cross(v1)
>>> n0
(0, 10000, -2000)
>>> n1
(0, 10000, -2000)

各法線を加える
>>> n2=n0+n1
正規化する
>>> a2n=n2.normalize()
a2の頂点法線
>>> a2n
(0, 0.980581, -0.196116)

-------------------------------
a3の頂点法線を求める
>>> v1=a2-a3
>>> v2=a0-a3
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, -2000)
>>> v1=a0-a3
>>> v2=a4-a3
>>> n1=v2.cross(v1)
>>> n1
(-0, 10000, 2000)

各法線を加える
>>> n2=n0+n1
>>> n2
(0, 20000, 0)
正規化する
>>> a3n=n2.normalize()
a3の頂点法線
>>> a3n
(0, 1, 0)

----------------------------
a4の頂点法線を求める
>>> v1=a3-a4
>>> v2=a0-a4
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)

>>> v2=a5-a4
>>> v1=a0-a4
>>> n1=v2.cross(v1)
>>> n1
(-0, 10000, 2000)

各法線を加える
>>> n2=n0+n1
正規化する
>>> a4n=n2.normalize()

a4の頂点法線
>>> a4n
(0, 0.980581, 0.196116)

----------------------------
a5の頂点法線を求める
>>> v2=a0-a5
>>> v1=a4-a5
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)
正規化する
>>> a5n=n0.normalize()

a5の頂点法線
>>> a5n
(0, 0.980581, 0.196116)
-----------------------------
a0の頂点法線を求める
>>> v2=a4-a0
>>> v1=a5-a0
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)
>>> v2=a3-a0
>>> v1=a4-a0
>>> n1=v2.cross(v1)
>>> n1
(0, 10000, 2000)
>>> v2=a2-a0
>>> v1=a3-a0
>>> n2=v2.cross(v1)
>>> n2
(0, 10000, -2000)
>>> v2=a1-a0
>>> v1=a2-a0
>>> n3=v2.cross(v1)
>>> n3
(0, 10000, -2000)

各法線を加える
>>> nn=n0+n1+n2+n3
正規化する
>>> a0n=nn.normalize()

a0の頂点法線
>>> a0n
(0, 1, 0)
  • -
  • -

面法線と頂点法線 その2 RIB出力

ということで、変換したRIBは以下のとおり、
ちょっとだけ、3Delightでエラー表示が出ますが、レンダリングはできます。


##RenderMan RIB-Structure 1.0
version 3.03
Format 512 300 1
PixelSamples 3 3
ShadingRate 1
Display "image.tif" "file" "rgb"
Projection "perspective" "fov" 5.963
ConcatTransform [
0.423401210556 -0.592993260602 -0.684901750458 0
0 0.756010361246 -0.654559648686 0
-0.905942280115 -0.277141347635 -0.320095702145 0
-4.13227435274e-005 5.57033550876e-005 1499.99997798 1
]

WorldBegin
LightSource "ambientlight" 0 "intensity" [ 0.10 ] "lightcolor" [ 1 1 1 ]
LightSource "distantlight" 1 "intensity" [ 0.80 ] "lightcolor" [ 1 1 1 ] "from" [ -1 1 -1 ] "to" [ 0 0 0 ]
LightSource "distantlight" 2 "intensity" [ 0.45 ] "lightcolor" [ 1 1 1 ] "from" [ 1 1 2.5 ] "to" [ 0 0 0 ]
LightSource "distantlight" 3 "intensity" [ 0.35 ] "lightcolor" [ 1 1 1 ] "from" [ 1 -1 -1 ] "to" [ 0 0 0 ]

AttributeBegin
Attribute "identifier" "name" ["obj1"]
Color [1 0 0]
Surface "plastic"
PointsPolygons [ 3 3 3 3 ] [ 0 1 2 0 2 3 4 5 0 4 0 3 ]
"P" [
50 20 0
50 0 -100
-50 0 -100
-50 20 -0
-50 0 100
50 0 100
]
"N" [ 0 1 0
0 0.980581 -0.196116
0 0.980581 -0.196116
0 1 0
0 0.980581 0.196116
0 0.980581 0.196116 ] "st" [ 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 ]
AttributeEnd

WorldEnd



image_tif.jpg
  • -
  • -

面法線と頂点法線 その3

Sitex Airでレンダリングしたら、
WARNING: "cnv_men_test2.rib" (24) Bad parameter list: st Parameter length mismatch - 24 found, 12 expected

stが長すぎたのでした。
"st" [ 1 0 1 1 0 1 1 0 0 1 0 0 ]
としました。

「RenderManを使いこなしていくためには、先駆者の経験を学び、
決まりごとを覚え、そして理屈で攻める。のが一番の早道です。」
              CTC RenderManの基礎より(2002)
コツコツと勉強していくことでわかってくるし、続けることですね。面白くなってきました。ありがとうございます。
  • -
  • -

<< 2/6 >>