Skip to content

Instantly share code, notes, and snippets.

@rikkimax
Created January 24, 2014 11:43
Show Gist options
  • Save rikkimax/8595894 to your computer and use it in GitHub Desktop.
Save rikkimax/8595894 to your computer and use it in GitHub Desktop.
A zpm model generator for blender 2.6, No material generation present.
import bpy
import random
from math import sin, cos
cubeobject = bpy.ops.mesh.primitive_cube_add
torusobject = bpy.ops.mesh.primitive_torus_add
coneobject = bpy.ops.mesh.primitive_cone_add
planeobject = bpy.ops.mesh.primitive_plane_add
resizeObject = bpy.ops.transform.resize
rotateObject = bpy.ops.transform.rotate
translateObject = bpy.ops.transform.translate
radialdist = 3
crystalsAround = 10
mainCrystalHeight = 3
rInVal = 0.1
crystalsAroundSize = crystalsAround - 8
twopi_over = 6.28 / crystalsAround
xpos = 0
ypos = 0
zpos = 15
xsize = 1.0
ysize = 1.0
zsize = 1.0
theta = 0.0
torusobject(location=(xpos, ypos, zpos + 0.35), major_radius=radialdist, minor_radius=.75, major_segments=crystalsAround)
resizeObject(value=(1.16, 1.16, 1))
planeobject(radius=1.3, location=(xpos, ypos, zpos + 1.14))
torusobject(location=(xpos, ypos, zpos - mainCrystalHeight * 1.4), major_radius=radialdist / 2, minor_radius=.5, major_segments=crystalsAround)
resizeObject(value=(1.16, 1.16, mainCrystalHeight * 3))
while theta < 6.28:
x = xpos + radialdist * cos(theta)
y = ypos + radialdist * sin(theta)
z = zpos
random.seed(theta)
xrvalue = 0
xraxis = (0, 0, 0)
if x > xpos:
xraxis = (0, 1, 0)
xrvalue = rInVal
elif x < xpos:
xraxis = (0, -1, 0)
xrvalue = rInVal
yrvalue = 0
yraxis = (0, 0, 0)
if y < ypos:
yraxis = (1, 0, 0)
yrvalue = rInVal
elif y > ypos:
yraxis = (-1, 0, 0)
yrvalue = rInVal
x = xpos + (radialdist * 0.75) * cos(theta)
y = ypos + (radialdist * 0.75) * sin(theta)
z1 = zpos + 0.75
z2 = zpos - mainCrystalHeight
for i in range(0, 2):
randNum = random.random()
cubeobject(location=(x, y, z1))
translateObject(value=(xraxis[1] * 0.25, 0, 0))
translateObject(value=(0, yraxis[0] * -0.3, 0))
resizeObject(value=(1.4, 1.4, 0.4))
rotateObject(value=randNum, axis=(0, 0, 1))
cubeobject(location=(x, y, z2))
resizeObject(value=(1, 1, mainCrystalHeight))
rotateObject(value=randNum, axis=(0, 0, 1))
rotateObject(value=xrvalue, axis=xraxis)
rotateObject(value=yrvalue, axis=yraxis)
for j in range(0, 2):
z3 = z1 - mainCrystalHeight * 2.3
coneobject(location=(x, y, z3), rotation=(xraxis[2] * randNum / 2, yraxis[0] * randNum / 2, 0), radius1=crystalsAroundSize * 0.35, radius2=0.1, depth=1.5, vertices=crystalsAround)
rotateObject(value=3.14, axis=(1, 1, 0))
translateObject(value=(xraxis[1] * randNum * j * 0.4, yraxis[0] * randNum* j * 0.4, 0))
cubeobject(location=(x, y, z2 - mainCrystalHeight))
translateObject(value=(xraxis[1] * -0.25, 0, 0))
translateObject(value=(0, yraxis[0] * 0.3, 0))
translateObject(value=(0, 0, -mainCrystalHeight / 2))
resizeObject(value=(0.3, 0.3, mainCrystalHeight / 2))
rotateObject(value=randNum, axis=(0, 0, 1))
rotateObject(value=xrvalue, axis=xraxis)
rotateObject(value=yrvalue, axis=yraxis)
for j in range(0, 5):
z3 = z1 - mainCrystalHeight * 3.4
coneobject(location=(x, y, z3), rotation=(xraxis[2] * randNum / 2, yraxis[0] * randNum / 2, 0), radius1=crystalsAroundSize * 0.2, radius2=0.07, depth=1, vertices=crystalsAround)
rotateObject(value=3.14, axis=(1, 1, 0))
translateObject(value=(xraxis[1] * -1.05, yraxis[0] * 1.05, 0))
x = xpos + (radialdist * 0.83) * cos(theta)
y = ypos + (radialdist * 0.83) * sin(theta)
z = zpos - mainCrystalHeight
cubeobject(location=(x, y, z))
xrvalue *= 0.75
yrvalue *= 0.75
resizeObject(value=(0.5 * crystalsAroundSize, 0.5 * crystalsAroundSize, mainCrystalHeight))
rotateObject(value=random.random(), axis=(0, 0, 1))
rotateObject(value=xrvalue, axis=xraxis)
rotateObject(value=yrvalue, axis=yraxis)
x = xpos + (radialdist * 0.52) * cos(theta)
y = ypos + (radialdist * 0.52) * sin(theta)
z = zpos - mainCrystalHeight * 2
cubeobject(location=(x, y, z))
xrvalue *= 0.75
yrvalue *= 0.75
translateObject(value=(0, 0, -mainCrystalHeight / 2))
resizeObject(value=(0.2 * crystalsAroundSize, 0.2 * crystalsAroundSize, mainCrystalHeight / 2))
rotateObject(value=random.random(), axis=(0, 0, 1))
rotateObject(value=xrvalue, axis=xraxis)
rotateObject(value=yrvalue, axis=yraxis)
theta += twopi_over
coneobject(location=(xpos, ypos, zpos - mainCrystalHeight * 3), rotation=(3.14, 0, 0), radius1=crystalsAroundSize * 0.7, radius2=0.2, depth=0.6, vertices=crystalsAround)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment