ModelHandle/sandbox/generate_test_obj.py
2021-05-09 15:42:57 +02:00

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