<< 7/8 >>
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]
UVをリストにする その2
参考・・・検討、日々考える。
st=[]
for x in range(0,count):
for y in range(0,obj.face[x].numVertex):
st.append(obj.face[x].coord[y])
out(str(obj.face[x].index[y])+":"+str(obj.face[x].coord[y]))
out(str(list(st)))
面白いことやってみよー!
Metasequoia pythonとても参考になる記事がありました。いいですね。
メタセコのPythonスクリプトをやってみよー2
http://yattemiyo555.blog133.fc2.com/blog-entry-53.html
勉強になります。ありがとうございます。
最初とまどいました。
1,凸凹地形を作成。
2,凸凹地形の子オブジェクトとして同じ大きさの地形のオブジェクトを配置する。頂点数は減らしておくといい。
3,木をつくる。
4,木を選択状態にする。
5,オブジェクトパネルから凸凹地形を選択してスクリプト実行。しばらくすると出てきます。
以下は、2601個、やられました。
Parthenon redererでレンダリング。
減らしました。
いろいろやってみると楽しいです。ありがとうございます。
面白いことやってみよー!その2
UV座標までは受け渡されていないようで、
これはこれで、また勉強になりそうです。
Metasequoia Python勉強です。Parthenon redererでレンダリング。
面白いことやってみよー!その3
objエクスポート、cgkit、課題はたくさんありますが、
細かい調整はこれから。勉強です。
メタセコイアからobjエクスポート、そしてpythonスクリプトでcgkitファイル出力。AO設定しておいて、3Delightでレンダリングしました。さすがにマシン遅くなります。第9地区つくったソフトだけに、レンダリング面白いです。
ちょっと浮いてますね。さらに精進します。
頂点法線 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)
metasequoia Python RIB export
メタセコイア PythonでのRIB出力について、ある程度スクリプトができた。頂点法線の出力方法を前の記事で書いたように、重複する頂点法線を何度も記入するとファイルが大きくなってしまう。また宣言をしておかなければならない、
Surface "plastic"
Color 1.000 0.243 0.439
とシェーダを加えて、3Delightでレンダリングしてみた。頂点法線の求め方は、どちらもグローシェーディングによる求め方だ。記述がちょっと違うだけだが、レンダリング結果は同じだった。
次に、頂点法線を求めないように、
normalcheck=False
として、求めてみた。
フラットシェーディングになり、plasticシェーダを入れていても、ハイライトは出ません。
最後に、メタセコイア上で、「面をなめらかにする」を選んで、ポリゴン数を増やした。ちよっときめ細かくなりますね。
面白いことをやってみよーその4
uv座標に対応したスクリプトを考えてもらった。ありがたいです。面白いことをやってみよー「
メタセコのPythonスクリプトをやってみよー3」試してみました。
1.まず、増やすモデルを準備します。オブジェクトobj1
2.つぎに、高さ0の平面をつくります。適当に拡大しておく。オブジェクトobj2
3.シフトキーを押しながら、オブジェクトパネルのobj1をクリックします。obj1が選択状態になります。
4.オブジェクトパネルのobj2をクリックします。
5.スクリプトエディタを開き、scatter2.pyを開きます。
rangeMin = MQSystem.newPoint(0, 0, 0)
rangeMax = MQSystem.newPoint(1, 0, 1)
6.実行します。
複製されたブツは、
ワイヤーフレーム表示でした。ちょっと調整が必要かも。メタセコのレンダリングでは表示されないところです。
しかしながら、RIB出力して、3Delightでレンダリングしてみました。
できました。ありがとうございます。
これはこれで、100体、すごいことになりました。なかなか面白いです。
ありがとうございます。
面白いことをやってみよーその5
metasequoia pythonを使って、RIB出力を工夫してみる。オブジェクトごとにだせるようにしてみた。
ブツごとにShaderを割り当てる。シーンをつくってみた。
Scatter2.py面白いですね。ありがとうございます。
バウンディングボックスを試す
面白いことをやってみよー「
メタセコのPythonスクリプトをやってみよー3」を参考に、選択したブツをバウンディングボックスで囲んでしまうスクリプトを試してみました。大変助かります。ありがとうございます。勉強になりました。
以下、スクリプト。
適当に、オブジェクトをつくり、オブジェクトパネルで選択しているブツが、スクリプト実行されると赤いボックスで囲まれてしまいます。
オブジェクトパネルで、表示・非表示できます。
高さがない平面を選択して実行すると、エラー表示します。
#bbox3.py
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
# オブジェクト座標の境界矩形の座標(最小と最大)を計算
def calcBoundary(obj):
minP = MQSystem.newPoint(obj.vertex[0].getPos().x, obj.vertex[0].getPos().y, obj.vertex[0].getPos().z)
maxP = MQSystem.newPoint(obj.vertex[0].getPos().x, obj.vertex[0].getPos().y, obj.vertex[0].getPos().z)
for vertex in obj.vertex:
p = vertex.getPos()
if p.x < minP.x:
minP.x = p.x
if p.x > maxP.x:
maxP.x = p.x
if p.y < minP.y:
minP.y = p.y
if p.y > maxP.y:
maxP.y = p.y
if p.z < minP.z:
minP.z = p.z
if p.z > maxP.z:
maxP.z = p.z
return minP, maxP
doc = MQSystem.getDocument()
obj = doc.object[doc.currentObjectIndex]
minP, maxP = calcBoundary(obj)
MQSystem.println(str(minP))
MQSystem.println(str(maxP))
def drawCube():
obj = MQSystem.newObject()
num=doc.numObject
a=num
obj.name="bbox_%d" % a #オブジェクト名をつける
s=MQSystem.newPoint
p =[s(maxP.x,maxP.y,maxP.z),
s(minP.x,maxP.y,maxP.z),
s(minP.x,minP.y,maxP.z),
s(maxP.x,minP.y,maxP.z),
s(maxP.x,maxP.y,minP.z),
s(minP.x,maxP.y,minP.z),
s(minP.x,minP.y,minP.z),
s(maxP.x,minP.y,minP.z)]
#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 )
num=doc.numMaterial
mat1=MQSystem.newMaterial()
doc.addMaterial(mat1) #マテリアルをドキュメントに追加
MQSystem.println(str(num))
doc.material[num].color.red=0.98
doc.material[num].color.green=0.11
doc.material[num].color.blue=0.11
doc.material[num].alpha=1.0
doc.material[num].diffuse=0.8
doc.material[num].ambient=0.6
doc.material[num].emissive=0.0
doc.material[num].specular=0.0
doc.material[num].power=5
MQSystem.println(" color : " + str(doc.material[num].color))
MQSystem.println(" alpha : %(#).3f" % {"#":doc.material[num].alpha})
MQSystem.println(" diffuse : %(#).3f" % {"#":doc.material[num].diffuse})
MQSystem.println(" ambient : %(#).3f" % {"#":doc.material[num].ambient})
MQSystem.println(" emissive : %(#).3f" % {"#":doc.material[num].emissive})
MQSystem.println(" specular : %(#).3f" % {"#":doc.material[num].specular})
MQSystem.println(" power : %(#).3f" % {"#":doc.material[num].power})
for face in obj.face:
face.material=num #マテリアルnum番を面に割り当てる
import traceback
import sys
try:
if minP.y==maxP.y:
MQSystem.messageBox("高さが同じです。平面を選択していませんか")
sys.exit()
drawCube()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
<< 7/8 >>