You are not logged in Log in Join
You are here: Home » Members » DaddyGravity » ContagiousFun » GeomTetra » View File

Log in
Name

Password

 

GeomTetra

File details
Size
4 K
File type
text/plain

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