1/1

メタセコイア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 )

  • -
  • -

1/1