File contents
#----------------------------------------------------------------------------------------
#
# geom_tetra.py
#
# Create a fractal-subdivision tetrahedron as a new prop in Poser
#
# Written by Jack Walther - Curious Labs, Inc. - 2000
#----------------------------------------------------------------------------------------
#-----------------------------------------------------------------------
# Modify this number to change the number of
# fractal subdivisions undergone by the tetrahedron.
# The higher the number the more complex the object.
#-----------------------------------------------------------------------
numSubdivisions = 3
#-----------------------------------------------------------------------
# Create a Vertex class to allow operations on
# vertices.
#-----------------------------------------------------------------------
class Vertex:
def __init__(self, x, y, z):
self.mx = x
self.my = y
self.mz = z
def x(self):
return self.mx
def y(self):
return self.my
def z(self):
return self.mz
def clone(self):
v = Vertex(self.mx, self.my, self.mz)
return v
#-----------------------------------------------------------------------
# return a new vertex which is the bisection point
# of the line segment spanned by v0 and v1
#-----------------------------------------------------------------------
def bisect(v0, v1):
v = Vertex( 0.5 * (v0.x() + v1.x()),
0.5 * (v0.y() + v1.y()),
0.5 * (v0.z() + v1.z()) )
return v
class Tetra:
def __init__(self, v0, v1, v2, v3):
self.mv0 = v0
self.mv1 = v1
self.mv2 = v2
self.mv3 = v3
def vertices(self):
list = []
list = list + [self.mv0, self.mv1, self.mv2, self.mv3]
return list
def polygons(self):
list = [ [2, 1, 0], [1, 3, 0], [3, 2, 0], [2, 3, 1] ]
return list
def subdivide(self):
t0 = Tetra( self.mv0.clone(),
bisect(self.mv0, self.mv1),
bisect(self.mv0, self.mv2),
bisect(self.mv0, self.mv3) )
t1 = Tetra( bisect(self.mv0, self.mv1),
self.mv1.clone(),
bisect(self.mv1, self.mv2),
bisect(self.mv1, self.mv3) )
t2 = Tetra( bisect(self.mv0, self.mv2),
bisect(self.mv1, self.mv2),
self.mv2.clone(),
bisect(self.mv2, self.mv3) )
t3 = Tetra( bisect(self.mv0, self.mv3),
bisect(self.mv1, self.mv3),
bisect(self.mv2, self.mv3),
self.mv3.clone() )
list = []
list = list + [t0,t1,t2,t3]
return list
#------------------------------------------------------------------------
# Set up base tetrahedron
#------------------------------------------------------------------------
v0 = Vertex(-0.5, 0, 0)
v1 = Vertex(0.5, 0, 0)
v2 = Vertex(0, 3**0.5/2, 0)
v3 = Vertex(0, 3**0.5/6, 0.76)
tetra0 = Tetra(v0, v1, v2, v3)
#------------------------------------------------------------------------
# Subdivide it
#------------------------------------------------------------------------
tetras = [tetra0]
for i in range (numSubdivisions):
temp = []
for tetra in tetras:
temp = temp + tetra.subdivide()
tetras = []
tetras = tetras + temp
#------------------------------------------------------------------------
# Create General Mesh and pass it to Poser
#------------------------------------------------------------------------
scene = poser.Scene()
meshgeom = poser.NewGeometry()
for tetra in tetras:
#-------------------------------
# create Numeric array of verts
#-------------------------------
newverts = []
for vert in tetra.vertices():
newverts = newverts + [ [vert.x(), vert.y(), vert.z()] ]
meshVerts = Numeric.array( newverts, Numeric.Float )
#-------------------------------
# create Numeric array of sets
#-------------------------------
meshSets = Numeric.array( tetra.polygons(), Numeric.Int)
meshSets = Numeric.ravel( meshSets ) # flatten array
#-------------------------------
# create Numeric array of polys
#-------------------------------
meshPolys = Numeric.array( [ [0,3], [3, 3], [6, 3], [9, 3] ], Numeric.Int )
meshgeom.AddGeneralMesh( meshPolys, meshSets, meshVerts )
#-------------------------------------------------------------------------
# Add it to the scene as a prop
#-------------------------------------------------------------------------
meshgeom.Weld()
newProp = scene.CreatePropFromGeom(meshgeom, "tetra")
newProp.DropToFloor()
newProp.Memorize()
newProp.SetDisplayStyle(poser.kDisplayCodeFLATLINED)
scene.DrawAll()