1/6 >>

メタセコイアpython 球体生成

何冊かのOpenGLの参考書をもとに球体をつくってみた。
面がバラバラになってしまうのが難点、連続していないので、スムージングができない。
30分割まで対応しているPythonスクリプトである。改めてPythonとメタセコイアの可能性を感じる。CGの先駆者の方々を尊敬します。ありがとうございます。

drawSphere(50, 8, 8)
半径50、8分割したところ。
drawsphere1.jpg

半径50、30分割
kyu30.jpg

参考スクリプトはこちら

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番を面に割り当てる


298.jpg
  • -
  • -

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便利ですね。ありがとうございます。
xny8.jpg

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コツコツやっていきます。使い方、探究心、広がります。ありがとうございます。
cyl2.jpg

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奥が深いですね。ありがとうございます。
tetra.jpg


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の使い方を検討する。今回は正八面体をつくってみた。面がばらばらにはなっていない。
octa.jpg

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の勉強になります。
dodeca.jpg


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の勉強は可能性あります。ありがとうございます。
icosa.jpg


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]))


  • -
  • -

メタセコイア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はきちんと渡されます。何か良い方法はないでしょうか。
box_mat.jpg
さらに勉強ですね。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]))

  • -
  • -

1/6 >>