<< 6/8 >>
メタセコイアpython マテリアル設定???
マテリアルの反射強度powerを設定するとspecularの方へ数値が渡されてしまう。うーん、いろいろとやっているところです。
doc.material[0].color.red=0.98
doc.material[0].color.green=0.11
doc.material[0].color.blue=0.11
doc.material[0].alpha=1.0
doc.material[0].diffuse=1.0
doc.material[0].ambient=0.0
doc.material[0].emissive=0.0
doc.material[0].specular=0.5
doc.material[0].power=100
と設定すると、
出力結果は、
color : [0.980, 0.110, 0.110]
alpha : 1.000
diffuse : 1.000
ambient : 0.000
emissive : 0.000
specular : 100.000
power : 5.000
となります。
power=100がspecular=100になってしまいます。???。
ちなみにdoc.material[0].power=100をコメントアウトすると
specularはきちんと渡されます。何か良い方法はないでしょうか。
さらに勉強ですね。metasequoia python面白いです。
ありがとうございます。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_cube_mat.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawCube():
obj = MQSystem.newObject()
s=MQSystem.newPoint
p =[s(50,50,50), s(-50,50,50), s(-50,-50,50),s(50,-50,50),
s(50,50,-50), s(-50,50,-50),s(-50,-50,-50), s(50,-50,-50)]
#out(str(p[0]))
for i in range(8):
obj.addVertex(p[i])
obj.addFace([3,2,1,0])
obj.addFace([4,7,3,0])
obj.addFace([1,5,4,0])
obj.addFace([2,6,5,1])
obj.addFace([3,7,6,2])
obj.addFace([5,6,7,4])
doc.addObject( obj )
mat1=MQSystem.newMaterial()
doc.addMaterial(mat1) #マテリアルをドキュメントに追加
doc.material[0].color.red=0.98
doc.material[0].color.green=0.11
doc.material[0].color.blue=0.11
doc.material[0].alpha=1.0
doc.material[0].diffuse=1.0
doc.material[0].ambient=0.0
doc.material[0].emissive=0.0
doc.material[0].specular=0.5
doc.material[0].power=100
out(" color : " + str(doc.material[0].color))
out(" alpha : %(#).3f" % {"#":doc.material[0].alpha})
out(" diffuse : %(#).3f" % {"#":doc.material[0].diffuse})
out(" ambient : %(#).3f" % {"#":doc.material[0].ambient})
out(" emissive : %(#).3f" % {"#":doc.material[0].emissive})
out(" specular : %(#).3f" % {"#":doc.material[0].specular})
out(" power : %(#).3f" % {"#":doc.material[0].power})
for face in obj.face:
face.material=0 #マテリアル0番を面に割り当てる
import traceback
import sys
try:
drawCube()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
メタセコイア マテリアル一括設定???
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))
メタセコイア マテリアル一括設定 その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はレンダリング中に応答なしになった。強制終了させた。床はちょっと控えめにメタセコイアから材質パネルを開いて、後で調整した。
調整前
調整後、面は鏡のように映り込みした。
アイデア次第でいろいろできますね。ありがとうございます。
メタセコイアpython 立方体生成その4
立方体を576個生成、乱数で高さを調整、マテリアルにメタリックを加える。Parthenon Renderでレンダリングした。
なお、反射強度は別でPythonでテキスト処理を行った。
以下はサンプルスクリプトです。実行後、地面や壁を加え、ポリゴンは三角化してます。
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
ありがとうございます。
Metasequoia Python 面インデックスと座標
メタセコイア Pythonを使って、面をきめるインデックス番号と頂点座標位置を表示する。
metasequoia pythonスクリプトとしては、基本となる。
あらかじめ、物体を作っておき、オブジェクトパネルで選択されていること。
以下のスクリプトまだきれいではありませんが、確認できます。ありがとうございます。
#face_index.py
doc=MQSystem.getDocument()
out=MQSystem.println
obj=doc.object[doc.currentObjectIndex]
out(str(obj.name))
for face in obj.face:
for aIndex in face.index:
out(str(aIndex))
for vert in obj.vertex:
pos=vert.getPos()
out(str(pos.x)+","+str(pos.y)+","+str(pos.z))
続きを読む>>
面法線と頂点法線 その4
前の記事のmetasequoia pythonで面のインデックスと頂点座標を求めてみた。これでRIBエクスポートが何とかかけそう。三角、四角、どうやって判別するか・・・・勉強します。
ありがとうございます。
obj1
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
MetasequoiaとPython 面情報
サンプルのobj出力を元に、選択したオブジェクトの面情報を出力できるように工夫してみました。あまり、きれいではありませんが、面白いです。ありがとうございます。
#face_index3.py
doc=MQSystem.getDocument()
out=MQSystem.println
obj=doc.object[doc.currentObjectIndex]
out(str(obj.name))
count=obj.numFace
out("面の数:"+str(count))
ten=[]
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))
for i in range(0,count):
out("面のindex:"+str(obj.getFaceIndexFromUniqueID(i+1)))
out("頂点数"+str(str(obj.face[i].numVertex)))
for j in range(0,obj.face[i].numVertex):
out(str(obj.face[i].index[j])+":"+str(ten[obj.face[i].index[j]]))
■出力情報
plane_-1
面の数:2
-50.0,0.0,-100.0
50.0,0.0,-100.0
50.0,0.0,0.0
-50.0,0.0,0.0
-50.0,0.0,100.0
50.0,0.0,100.0
面のindex:0
頂点数4
0:(-50.0, 0.0, -100.0)
1:(50.0, 0.0, -100.0)
2:(50.0, 0.0, 0.0)
3:(-50.0, 0.0, 0.0)
面のindex:1
頂点数4
2:(50.0, 0.0, 0.0)
5:(50.0, 0.0, 100.0)
4:(-50.0, 0.0, 100.0)
3:(-50.0, 0.0, 0.0)
頂点法線 vertex normalを求める
PointsPolygonを求めたいので、各頂点の法線ベクトルを順に辞書に格納していき、空でなければ、加えていくようにしました。
最後に正規化をかけて、できあがり。グローシェーディングの求め方です。本来ならば、外積など関連するものはモジュール化してしまえばよいのですが、まだまだ修行がたりません。
出力したものをエディタ使ってRIBにしてみたら、面が表示されず、頂点indexの順番をreverse()したら、表示されました。理屈で攻めていかなければならないところですが、泥臭いところです。法線を求められたのは、ちょっとうれしいです。佐藤義雄先生の「実習グラフィックス」、メタセコイアマスターガイドを参考にしました。後、LilyEightのアプリBも参考になりました。PolygonからPointsPolygonにするRIB to RIBがあります。
先駆者の資料は役立ちます。
metasequoia python interfaceの中にホントはもっと簡単に求められる方法があるのかもしれません。
まだまだ自己満足なところですが、レンダリング結果はこんな感じでした。
サンプルスクリプトです。もう一歩前にすすみたいところです。ありがとうございます。
#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])))
<< 6/8 >>