<< 5/12 >>
5角形をつくる メタセコイア Python
検証しながら、復習しながら、くりかえしですね。
5角形というか三角形のポリゴンが5つ並んだmetasequoia python scriptです。
#polygon5.py
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
obj = MQSystem.newObject()
obj.name = "polygon_%d" % segment
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#0
crad = crad+irad
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#1
crad = crad+irad
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#2
crad = crad+irad
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#3
crad = crad+irad
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#4
obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) )#5
obj.addFace([0,5,1])
obj.addFace([1,5,2])
obj.addFace([2,5,3])
obj.addFace([3,5,4])
obj.addFace([4,5,0])
doc.addObject( obj )
5角形をつくる メタセコイア Python その2
くりかえし処理を使って、5角形をつくる方法を記述してみた。obj.addFaceの部分でどういう順番で書けばよいか、前の記事の頂点の並び方を見て考えればわかってくる。(i+1)%segmentは、割り算の余りを求めている。メタセコイアPythonの使い方、わかってくると面白い。さらに勉強ですね。
#polygon5_2.py
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
obj = MQSystem.newObject()
obj.name = "polygon_%d" % segment
for i in range(segment):
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#0
crad = crad+irad
obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) )#5
for i in range(segment):
obj.addFace([i,segment,(i+1)%segment])
doc.addObject( obj )
Metasequoia Python 立方体を複数つくる その5
for文を使うとエラーが出ていましたが、マテリアルを関数の中に記述したら、エラーが出なくなりました。
for face in obj.face:
face.material=0 #マテリアル0番を面に割り当てる
を追加することでエラーが消えています。
しかもネスト入れ子構造にしてもOK。メタセコイアPython、とりあえず動いています。
まだマテリアルのところの処理は良くないです。材質パネルにたくさんできてしまいます。サンプルスクリプトはこちらです。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
# 基本図形、新規オブジェクトで立方体複数つくる その2
#error4.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)
doc.material[0].color.red=0.99
doc.material[0].color.green=0.12
doc.material[0].color.blue=0.11
for face in obj.face:
face.material=0 #マテリアル0番を面に割り当てる
import traceback
import sys
#dist=0
try:
for dist in range(0,340,110):
for dist2 in range(0,340,110):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,dist2)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
立方体を整列、ランダムに色をつける
メタセコイアでPythonを触る。これまでの記事をくりかえし復習しながら
サンプルスクリプトを実行してみた。
関数で立方体を生成し、新規マテリアルを追加、ランダムな色をつけておき、指定した座標に配置する。
使い方としては、立方体の大きさを調整したり、配置する間隔を決めていく、試行錯誤しながら決めていく。
ありがとうございます。
サンプルpythonスクリプトを参考にしてください。
import random
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
# 基本図形、新規オブジェクトで立方体複数つくる その2
#meta_cube_def_rndc.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=random.random()
doc.material[numm].color.green=random.random()
doc.material[numm].color.blue=random.random()
for face in obj.face:
face.material=numm #マテリアルnumm番を面に割り当てる
import traceback
import sys
#dist=0
try:
for dist in range(0,340,110):
for dist2 in range(0,340,110):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,dist2)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
メタセコイアpython 立方体生成
前の記事のスクリプトを変更した。
for dist in range(0,1000,60):
for dist2 in range(0,1000,60):
#out(str(i))
out(str(dist))
unitcube(50,dist-500,25,dist2-500)
全部で290個、立方体を生成した。四角形面を三角形化し、Parthenon Rendererでレンダリングを行った。
メタセコイアpython 立方体生成その2
ランダムモジュールを使って、高さ位置を調整することで、
凸凹になるようにした。Parthenon Rendererでレンダリング
unitcube(50,dist-500,25+random.gauss(0,8),dist2-500)
MetasequoiaからParthenon
metasequoia python scriptを使って立方体を576個出力
for dist in range(0,1400,60):
for dist2 in range(0,1400,60):
#out(str(i))
out(str(dist))
unitcube(40,dist-700,20+random.gauss(0,8),dist2-700)
ファイルを保存し、Parthenonでレンダリングした。
勉強ですね。ありがとうございます。
Pythonスクリプトで立方体をつくる
メタセコでのPythonスクリプト、引き続き勉強中。
立方体生成について、別の方法を記述してみた。
頂点をリストpで作っておき、addVertexでオブジェクトに追加、面の方向を決めて、ドキュメントに追加し、シーンに表示する。
newPointで点を追加してあげないと、うまくいかないようです。
以下のスクリプトは、OpenGLの記述を参考にしました。エラー処理もできるように、関数drawCube()をはさんでおきました。いろいろと実験してみてください。頂点の順番はOpenGLとは逆になります。
残念ながら。この記述だと面がばらばらになります。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_drawcube3.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]))
obj.addFace([obj.addVertex(p[3]), obj.addVertex(p[2]),
obj.addVertex(p[1]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[4]), obj.addVertex(p[7]),
obj.addVertex(p[3]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[1]), obj.addVertex(p[5]),
obj.addVertex(p[4]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[2]), obj.addVertex(p[6]),
obj.addVertex(p[5]), obj.addVertex(p[1])])
obj.addFace([obj.addVertex(p[3]), obj.addVertex(p[7]),
obj.addVertex(p[6]), obj.addVertex(p[2])])
obj.addFace([obj.addVertex(p[5]), obj.addVertex(p[6]),
obj.addVertex(p[7]), obj.addVertex(p[4])])
doc.addObject( obj )
import traceback
import sys
#dist=0
try:
drawCube()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
Pythonでメタセコイアを操る
立方体の生成で、頂点リストpを設けたとき、下記のような記述でも大丈夫なんですね。いろいろと試してみるのが良いですね。
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)]
p=[]
p.append(s(50,50,50))
p.append(s(-50,50,50))
p.append(s(-50,-50,50))
p.append(s(50,-50,50))
p.append(s(50,50,-50))
p.append(s(-50,50,-50))
p.append(s(-50,-50,-50))
p.append(s(50,-50,-50))
メタセコイアpython 球体生成
何冊かのOpenGLの参考書をもとに球体をつくってみた。
面がバラバラになってしまうのが難点、連続していないので、スムージングができない。
30分割まで対応しているPythonスクリプトである。改めてPythonとメタセコイアの可能性を感じる。CGの先駆者の方々を尊敬します。ありがとうございます。
drawSphere(50, 8, 8)
半径50、8分割したところ。
半径50、30分割
参考スクリプトはこちら
import math
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_drawSphere.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]))
obj.addFace([obj.addVertex(p[3]), obj.addVertex(p[2]),
obj.addVertex(p[1]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[4]), obj.addVertex(p[7]),
obj.addVertex(p[3]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[1]), obj.addVertex(p[5]),
obj.addVertex(p[4]), obj.addVertex(p[0])])
obj.addFace([obj.addVertex(p[2]), obj.addVertex(p[6]),
obj.addVertex(p[5]), obj.addVertex(p[1])])
obj.addFace([obj.addVertex(p[3]), obj.addVertex(p[7]),
obj.addVertex(p[6]), obj.addVertex(p[2])])
obj.addFace([obj.addVertex(p[5]), obj.addVertex(p[6]),
obj.addVertex(p[7]), obj.addVertex(p[4])])
doc.addObject( obj )
def drawSphere(radius, nSlice, nStack):
obj = MQSystem.newObject()
s=MQSystem.newPoint
M_PI=3.14159265358979323846
p={} #dictionary
if nSlice > 30:
nSlice = 30
if nStack > 30 :
nStack = 30
for i in range(nSlice+1):
phi = 2.0 * M_PI *i / nSlice
for j in range(nStack+1):
theta = M_PI * j / nStack
px = radius * math.sin(theta) * math.cos(phi)
py = radius * math.sin(theta) * math.sin(phi)
pz = radius * math.cos(theta)*1.0
p[i,j]=s(px,py,pz)
for i in range( nSlice):
p1 = p[i,0]
p2 = p[i,1]
p3 = p[i+1,1]
obj.addFace([obj.addVertex(p3), obj.addVertex(p2),
obj.addVertex(p1)])
j=nStack-1;
for i in range(nSlice):
p1 = p[i,j]
p2 = p[i,j+1]
p3 = p[i+1,j]
obj.addFace([obj.addVertex(p3), obj.addVertex(p2),
obj.addVertex(p1)])
for i in range(nSlice):
for j in range(1 , nStack-1):
p1 = p[i,j]
p2 = p[i,j+1]
p3 = p[i+1,j+1]
p4 = p[i+1,j]
obj.addFace([obj.addVertex(p4), obj.addVertex(p3),
obj.addVertex(p2),obj.addVertex(p1)])
doc.addObject( obj )
import traceback
import sys
try:
#drawCube()
drawSphere(50, 8, 8)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
<< 5/12 >>