<< 5/8 >>
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]))
メタセコイアpython 立方体生成その3
Pythonスクリプト、いろいろ考えたり、調べたりして勉強していくと面白いです。真似をしていくことで、発見があるから、やる気が出てきます。
今回はPOV-Rayのサンプルから、色を調整してみました。Parthenon Rendererでレンダリング。ありがとうございます。
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
for face in obj.face:
face.material=numm #マテリアルnumm番を面に割り当てる
Pythonスクリプトで立方体をつくる その2
面がバラバラにならないようにするために、addVertexとaddFaceを分けて書いてみました。立方体はつながっていますが、球体で試してみると、バラバラ?・・・悩みます。
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.addVertex(p[0])
obj.addVertex(p[1])
obj.addVertex(p[2])
obj.addVertex(p[3])
obj.addVertex(p[4])
obj.addVertex(p[5])
obj.addVertex(p[6])
obj.addVertex(p[7])
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 )
メタセコイアPython 円柱をつくる
OpenGL参考書を元につくってみた。
面はバラバラだが、とりあえず完成、分割数を入れるだけのシンプルなもの16分割まで対応している。
Meatasequoiaの使い方の幅がぐっと増えるし、CGの勉強になります。Python便利ですね。ありがとうございます。
import math
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#drawCyl.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawCylinder(Nxy):
obj = MQSystem.newObject()
s=MQSystem.newPoint
#直径50、高さ50の円柱(中心が原点),分割数:Nxy
PI=3.1415926535
if Nxy>16:
Nxy = 16
p={} #dictionary
theta0 = PI/Nxy
for i in range(Nxy):
theta = -theta0+2.0*theta0*i
p[i] = s(50*math.cos(theta), 50*math.sin(theta),50) #上底のx成分,y成分,z成分(高さ)
p[i+Nxy] = s(50*math.cos(theta), 50*math.sin(theta), -50) #下底のx成分,y成分,z成分
#上底
for i in range(Nxy):
obj.addVertex(p[i])
#下底
i=2*Nxy-1
for i in range(i,Nxy,-1):
obj.addVertex(p[i])
#側面
for i in range(Nxy):
ii = i+1
if ii == Nxy:
ii = 0
obj.addFace([obj.addVertex(p[ii]), obj.addVertex(p[ii+Nxy]),
obj.addVertex(p[i+Nxy]),obj.addVertex(p[i])])
doc.addObject( obj )
import traceback
import sys
try:
#
drawCylinder(8)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
メタセコイアPython 円柱をつくる その2
円柱に上下、ふたをしてみた。点の順番で苦労した。面倒ですが、できるとうれしい。Y方向に配置しました。試してみるのが一番、Metasequoia Pythonコツコツやっていきます。使い方、探究心、広がります。ありがとうございます。
import math
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#drawCyl2.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawCylinder(Nxy,r=50):
obj = MQSystem.newObject()
s=MQSystem.newPoint
#直径50、高さ50の円柱(中心が原点),分割数:Nxy
PI=3.1415926535
if Nxy>16:
Nxy = 16
p={} #dictionary
theta0 = PI/Nxy
for i in range(Nxy):
theta = -theta0+2.0*theta0*i
p[i] = s(r*math.cos(theta),r, r*math.sin(theta)) #上底のx成分,y成分(高さ),z成分
p[i+Nxy] = s(r*math.cos(theta), -r, r*math.sin(theta)) #下底のx成分,y成分,z成分
#上底
for i in range(Nxy):
out(str(i))
obj.addVertex(p[i])
obj.addVertex( MQSystem.newPoint( 0.0, r, 0.0 ) )
for i in range(Nxy):
obj.addFace([(i+1)%Nxy,Nxy,i])
#下底
for i in range(Nxy,2*Nxy):
out("v"+str(i))
obj.addVertex(p[i])
obj.addVertex( MQSystem.newPoint( 0.0, -r, 0.0 ) )
for i in range(Nxy,2*Nxy):
if i+2==Nxy*2+1:
obj.addFace([i+1,Nxy*2+1,Nxy+1])
out(str(i+1))
else:
obj.addFace([i+1,Nxy*2+1,i+2])
out("e"+str(i+1))
#側面
for i in range(Nxy):
ii = i+1
if ii == Nxy:
ii = 0
obj.addFace([obj.addVertex(p[i]), obj.addVertex(p[i+Nxy]),
obj.addVertex(p[ii+Nxy]),obj.addVertex(p[ii])])
doc.addObject( obj )
import traceback
import sys
try:
#
drawCylinder(8)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
正四面体をつくる メタセコイア Python
単に数値を入力しただけですが、可能性があります。metasequoiaとpython奥が深いですね。ありがとうございます。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_drawtetra.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawTetra():
obj = MQSystem.newObject()
s=MQSystem.newPoint
p =[s(-50,0,28.9), s(50,0,28.9), s(0,0,-57.7),s(0,81.6,0)]
out(str(p[0]))
obj.addVertex(p[0])
obj.addVertex(p[1])
obj.addVertex(p[2])
obj.addVertex(p[3])
obj.addFace([3,1,0])
obj.addFace([3,2,1])
obj.addFace([3,0,2])
obj.addFace([1,2,0])
doc.addObject( obj )
import traceback
import sys
try:
drawTetra()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
三次元空間における正多面体は、正四面体 (tetrahedron), 正六面体 (hexahedron), 正八面体 (octahedron), 正十二面体 (dodecahedron), 正二十面体 (icosahedron) の 5 種類しか存在しない。このうちの最後のシ者。アイカゥサ ヒィドゥルンと発音するらしい。
正多面体については、こちらの記事から引用
http://beu.sblo.jp/article/2358290.html
ありがとうございます。参考になります。
正八面体をつくる メタセコ Python
Metasequoia Pythonの使い方を検討する。今回は正八面体をつくってみた。面がばらばらにはなっていない。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_drawocta.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawOcta():
obj = MQSystem.newObject()
s=MQSystem.newPoint
p =[s(-50,0,0), s(0,0,50), s(50,0,0),s(0,0,-50), s(0,50,0),s(0,-50,0)]
out(str(p[0]))
obj.addVertex(p[0])
obj.addVertex(p[1])
obj.addVertex(p[2])
obj.addVertex(p[3])
obj.addVertex(p[4])
obj.addVertex(p[5])
obj.addFace([4,1,0])
obj.addFace([4,2,1])
obj.addFace([4,3,2])
obj.addFace([4,0,3])
obj.addFace([1,5,0])
obj.addFace([2,5,1])
obj.addFace([3,5,2])
obj.addFace([0,5,3])
doc.addObject( obj )
import traceback
import sys
#dist=0
try:
drawOcta()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
正十二面体をつくる メタセコ Python
正十二面体のモデルを打ち込んでみました。目がショボショボ、疲れました。三角ポリゴンで5角形をつくっているので、python scriptがとても長くなりました。metasequoia python さらに勉強します。曲面制御すると良いですね。面白いです。メタセコイアとPythonはCGの勉強になります。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_dodeca.py
doc = MQSystem.getDocument()
out = MQSystem.println
def drawDodeca():
obj = MQSystem.newObject()
s=MQSystem.newPoint
p =[s(-100,100,-100), s(-100,100,100), s(-100,-100,100),s(-100,-100,-100),
s(100,100,-100), s(100,100,100), s(100,-100,100),s(100,-100,-100),
s(-161.8,61.8,0), s(-161.8,-61.8,0), s(161.8,61.8,0),s(161.8,-61.8,0),
s(0,161.8,-61.8), s(0,161.8,61.8), s(0,-161.8,-61.8),s(0,-161.8,61.8),
s(-61.8,0,161.8), s(61.8,0,161.8), s(-61.8,0,-161.8),s(61.8,0,-161.8)]
out(str(p[0]))
for i in range(20):
obj.addVertex(p[i])
#1
obj.addFace([0,12,13])
obj.addFace([0,13,1])
obj.addFace([0,1,8])
#2
obj.addFace([1,16,2])
obj.addFace([1,2,9])
obj.addFace([1,9,8])
#3
obj.addFace([1,13,5])
obj.addFace([1,5,17])
obj.addFace([1,17,16])
#4
obj.addFace([5,13,12])
obj.addFace([5,12,4])
obj.addFace([5,4,10])
#5
obj.addFace([0,18,19])
obj.addFace([0,19,4])
obj.addFace([0,4,12])
#6
obj.addFace([0,8,9])
obj.addFace([0,9,3])
obj.addFace([0,3,18])
#7
obj.addFace([2,16,17])
obj.addFace([2,17,6])
obj.addFace([2,6,15])
#8
obj.addFace([5,10,11])
obj.addFace([5,11,6])
obj.addFace([5,6,17])
#9
obj.addFace([3,14,7])
obj.addFace([3,7,19])
obj.addFace([3,19,18])
#10
obj.addFace([2,15,14])
obj.addFace([2,14,3])
obj.addFace([2,3,9])
#11
obj.addFace([7,14,15])
obj.addFace([7,15,6])
obj.addFace([7,6,11])
#12
obj.addFace([4,19,7])
obj.addFace([4,7,11])
obj.addFace([4,11,10])
doc.addObject( obj )
import traceback
import sys
try:
drawDodeca()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
正二十面体をつくる メタセコイア Python
metasequoia python scriptを使ってモデリングの練習しています。正二十面体をつくってみました。参考書はアスキー出版局から出ていた佐藤義雄先生の「実習グラフィックス」。1986年の出版ですが、多くの人が参考にした本ですね。BASICによるプログラムがのっています。まだ入手できるのかわかりませんが、手元のは1995年22刷。息が長いですね。CGの勉強は可能性あります。ありがとうございます。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
#meta_icosa.py 正二十面体
doc = MQSystem.getDocument()
out = MQSystem.println
def drawIcosa():
obj = MQSystem.newObject()
s=MQSystem.newPoint
p =[s(-68.8,42.5,-50), s(-68.8,42.5,50), s(26.3,42.5,80.9),s(85.1,42.5,0),
s(26.3,42.5,-80.9), s(-85.1,-42.5,0), s(-26.3,-42.5,80.9),s(68.8,-42.5,50),
s(68.8,-42.5,-50), s(-26.3,-42.5,-80.9), s(0,95.1,0),s(0,-95.1,0)]
out(str(p[0]))
for i in range(12):
obj.addVertex(p[i])
obj.addFace([10,1,0]) #1
obj.addFace([10,2,1]) #2
obj.addFace([10,3,2]) #3
obj.addFace([10,4,3]) #4
obj.addFace([10,0,4]) #5
obj.addFace([5,0,1]) #6
obj.addFace([6,5,1]) #7
obj.addFace([2,6,1]) #8
obj.addFace([7,6,2]) #9
obj.addFace([3,7,2]) #10
obj.addFace([8,7,3])
obj.addFace([4,8,3])
obj.addFace([9,8,4])
obj.addFace([0,9,4])
obj.addFace([5,9,0]) #15
obj.addFace([11,5,6])
obj.addFace([11,6,7])
obj.addFace([11,7,8])
obj.addFace([11,8,9])
obj.addFace([11,9,5]) #20
doc.addObject( obj )
import traceback
import sys
try:
drawIcosa()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
<< 5/8 >>