191 lines
4.6 KiB
Python
191 lines
4.6 KiB
Python
import os
|
|
import sys
|
|
import math
|
|
|
|
from lib import tools_lib as Tools
|
|
|
|
class ObjWriter:
|
|
def __init__ (self):
|
|
self.content = ''
|
|
self.offsetX = 0.0
|
|
self.offsetY = 0.0
|
|
self.offsetZ = 0.0
|
|
self.scale = 1.0
|
|
self.vertexCount = 0
|
|
self.vertexOffset = 0
|
|
|
|
def GetContent (self):
|
|
return self.content
|
|
|
|
def SetOffset (self, x, y, z):
|
|
self.offsetX = x
|
|
self.offsetY = y
|
|
self.offsetZ = z
|
|
|
|
def SetScale (self, scale):
|
|
self.scale = scale
|
|
|
|
def AddMesh (self, name):
|
|
self.AddLine ('g ' + name)
|
|
self.vertexOffset = self.vertexCount
|
|
|
|
def AddVertex (self, x, y, z):
|
|
self.AddLine ('v ' + ' '.join ([str (x * self.scale + self.offsetX), str (y * self.scale + self.offsetY), str (z * self.scale + self.offsetZ)]))
|
|
self.vertexCount += 1
|
|
|
|
def AddFace (self, vertices):
|
|
objVertices = []
|
|
for vertex in vertices:
|
|
objVertices.append (str (vertex + self.vertexOffset + 1))
|
|
self.AddLine ('f ' + ' '.join (objVertices))
|
|
|
|
def AddLine (self, line):
|
|
self.content += line + '\n'
|
|
|
|
def DistFromOrigin (x, y, z):
|
|
return math.sqrt (x * x + y * y + z * z)
|
|
|
|
def Main (argv):
|
|
currentDir = os.path.dirname (os.path.abspath (__file__))
|
|
os.chdir (currentDir)
|
|
|
|
ow = ObjWriter ()
|
|
|
|
ow.AddMesh ('Tetrahedron')
|
|
a = 1.0
|
|
ow.SetOffset (0.0, 0.0, 0.0)
|
|
ow.SetScale (1.0 / DistFromOrigin (a, a, a))
|
|
ow.AddVertex (+a, +a, +a)
|
|
ow.AddVertex (-a, -a, +a)
|
|
ow.AddVertex (-a, +a, -a)
|
|
ow.AddVertex (+a, -a, -a)
|
|
ow.AddFace ([0, 1, 3])
|
|
ow.AddFace ([0, 2, 1])
|
|
ow.AddFace ([0, 3, 2])
|
|
ow.AddFace ([1, 2, 3])
|
|
|
|
ow.AddMesh ('Hexahedron')
|
|
a = 1.0
|
|
ow.SetOffset (0.0, 3.0, 0.0)
|
|
ow.SetScale (1.0 / DistFromOrigin (a, a, a))
|
|
ow.AddVertex (+a, +a, +a)
|
|
ow.AddVertex (+a, +a, -a)
|
|
ow.AddVertex (+a, -a, +a)
|
|
ow.AddVertex (+a, -a, -a)
|
|
ow.AddVertex (-a, +a, +a)
|
|
ow.AddVertex (-a, +a, -a)
|
|
ow.AddVertex (-a, -a, +a)
|
|
ow.AddVertex (-a, -a, -a)
|
|
ow.AddFace ([0, 1, 5, 4])
|
|
ow.AddFace ([0, 2, 3, 1])
|
|
ow.AddFace ([0, 4, 6, 2])
|
|
ow.AddFace ([1, 3, 7, 5])
|
|
ow.AddFace ([2, 6, 7, 3])
|
|
ow.AddFace ([4, 5, 7, 6])
|
|
|
|
ow.AddMesh ('Octahedron')
|
|
a = 1.0
|
|
b = 0.0
|
|
ow.SetOffset (3.0, 0.0, 0.0)
|
|
ow.SetScale (1.0 / DistFromOrigin (a, b, b))
|
|
ow.AddVertex (+a, +b, +b)
|
|
ow.AddVertex (-a, +b, +b)
|
|
ow.AddVertex (+b, +a, +b)
|
|
ow.AddVertex (+b, -a, +b)
|
|
ow.AddVertex (+b, +b, +a)
|
|
ow.AddVertex (+b, +b, -a)
|
|
ow.AddFace ([0, 2, 4])
|
|
ow.AddFace ([0, 3, 5])
|
|
ow.AddFace ([0, 4, 3])
|
|
ow.AddFace ([0, 5, 2])
|
|
ow.AddFace ([1, 2, 5])
|
|
ow.AddFace ([1, 3, 4])
|
|
ow.AddFace ([1, 4, 2])
|
|
ow.AddFace ([1, 5, 3])
|
|
|
|
ow.AddMesh ('Dodecahedron')
|
|
a = 1.0
|
|
b = 0.0
|
|
c = (1.0 + math.sqrt (5.0)) / 2.0
|
|
d = 1.0 / c
|
|
ow.SetOffset (3.0, 3.0, 0.0)
|
|
ow.SetScale (1.0 / DistFromOrigin (a, a, a))
|
|
ow.AddVertex (+a, +a, +a)
|
|
ow.AddVertex (+a, +a, -a)
|
|
ow.AddVertex (+a, -a, +a)
|
|
ow.AddVertex (-a, +a, +a)
|
|
ow.AddVertex (+a, -a, -a)
|
|
ow.AddVertex (-a, +a, -a)
|
|
ow.AddVertex (-a, -a, +a)
|
|
ow.AddVertex (-a, -a, -a)
|
|
ow.AddVertex (+b, +d, +c)
|
|
ow.AddVertex (+b, +d, -c)
|
|
ow.AddVertex (+b, -d, +c)
|
|
ow.AddVertex (+b, -d, -c)
|
|
ow.AddVertex (+d, +c, +b)
|
|
ow.AddVertex (+d, -c, +b)
|
|
ow.AddVertex (-d, +c, +b)
|
|
ow.AddVertex (-d, -c, +b)
|
|
ow.AddVertex (+c, +b, +d)
|
|
ow.AddVertex (-c, +b, +d)
|
|
ow.AddVertex (+c, +b, -d)
|
|
ow.AddVertex (-c, +b, -d)
|
|
ow.AddFace ([0, 8, 10, 2, 16])
|
|
ow.AddFace ([0, 16, 18, 1, 12])
|
|
ow.AddFace ([0, 12, 14, 3, 8])
|
|
ow.AddFace ([1, 9, 5, 14, 12])
|
|
ow.AddFace ([1, 18, 4, 11, 9])
|
|
ow.AddFace ([2, 10, 6, 15, 13])
|
|
ow.AddFace ([2, 13, 4, 18, 16])
|
|
ow.AddFace ([3, 14, 5, 19, 17])
|
|
ow.AddFace ([3, 17, 6, 10, 8])
|
|
ow.AddFace ([4, 13, 15, 7, 11])
|
|
ow.AddFace ([5, 9, 11, 7, 19])
|
|
ow.AddFace ([6, 17, 19, 7, 15])
|
|
|
|
ow.AddMesh ('Icosahedron')
|
|
a = 1.0
|
|
b = 0.0
|
|
c = (1.0 + math.sqrt (5.0)) / 2.0
|
|
ow.SetOffset (6.0, 1.5, 0.0)
|
|
ow.SetScale (1.0 / DistFromOrigin (b, a, c))
|
|
ow.AddVertex (+b, +a, +c)
|
|
ow.AddVertex (+b, +a, -c)
|
|
ow.AddVertex (+b, -a, +c)
|
|
ow.AddVertex (+b, -a, -c)
|
|
ow.AddVertex (+a, +c, +b)
|
|
ow.AddVertex (+a, -c, +b)
|
|
ow.AddVertex (-a, +c, +b)
|
|
ow.AddVertex (-a, -c, +b)
|
|
ow.AddVertex (+c, +b, +a)
|
|
ow.AddVertex (+c, +b, -a)
|
|
ow.AddVertex (-c, +b, +a)
|
|
ow.AddVertex (-c, +b, -a)
|
|
ow.AddFace ([0, 2, 8])
|
|
ow.AddFace ([0, 4, 6])
|
|
ow.AddFace ([0, 6, 10])
|
|
ow.AddFace ([0, 8, 4])
|
|
ow.AddFace ([0, 10, 2])
|
|
ow.AddFace ([1, 3, 11])
|
|
ow.AddFace ([1, 4, 9])
|
|
ow.AddFace ([1, 6, 4])
|
|
ow.AddFace ([1, 9, 3])
|
|
ow.AddFace ([1, 11, 6])
|
|
ow.AddFace ([2, 5, 8])
|
|
ow.AddFace ([2, 7, 5])
|
|
ow.AddFace ([2, 10, 7])
|
|
ow.AddFace ([3, 5, 7])
|
|
ow.AddFace ([3, 7, 11])
|
|
ow.AddFace ([3, 9, 5])
|
|
ow.AddFace ([4, 8, 9])
|
|
ow.AddFace ([5, 9, 8])
|
|
ow.AddFace ([6, 11, 10])
|
|
ow.AddFace ([7, 10, 11])
|
|
|
|
print (ow.GetContent ())
|
|
Tools.WriteContentToFile ('solids.obj', ow.GetContent ())
|
|
|
|
return 0
|
|
|
|
sys.exit (Main (sys.argv))
|