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