3dgen.py

import perlin3D
import perlin2D
from mayavi.scripts import mayavi2
from tvtk.api import tvtk
import numpy as np
 
from skimage import measure
 
 
def customrange(end, start=0, step=1):
    if start >= end:
        i = start
        while i > end:
            yield i
            i -= step
    else:
        i = start
        while i < end:
            yield i
            i += step
 
@mayavi2.standalone
def view(mesh):
    '''Stellt ein tvtk.Polydata mesh im mayavi2 Standalone dar.'''
    from mayavi.sources.vtk_data_source import VTKDataSource
    from mayavi.modules.surface import Surface
 
    mayavi.new_scene()
    src = VTKDataSource(data=mesh)
    mayavi.add_source(src)
    s = Surface()
    mayavi.add_module(s)
 
 
 
def gen3dterrain(heightmap):
    '''Fuegt einer zweidimensionalen heightmap 3D-Features wie Ueberhaenge hinzu.
    Gibt eine Liste mit 3D - Voxeldaten zurueck'''
    perlin3D.setmaxsize(len(heightmap))
    terrain = []
    for n,i in enumerate(heightmap):
        terrain.append([])
        for m,j in enumerate(i):
            terrain[-1].append([])
            x = 0
            for k in customrange(1.5,-1.5,0.05):
                h = perlin3D.perlinnoise(n, m ,x ,0.03125)
                terrain[-1][-1].append(h+((x-(j/0.05)-40)**3)*-0.025)
                x += 1
    return terrain
 
if __name__ == '__main__':
    heightmap = []
    heightmap = perlin2D.genheightmap(200, 0.03125)
    terrain = np.asarray(gen3dterrain(heightmap))
 
    verts, faces = measure.marching_cubes(terrain, 0)
 
    print "FINISHED CALCULATING"
 
    mesh = tvtk.PolyData(points=verts, polys=faces)
    view(mesh)