<< Pythonでメタセコイアを操る 戻る メタセコイアpython 立方体生成その3 >>

メタセコイア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でメタセコイアを操る 戻る メタセコイアpython 立方体生成その3 >>