Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1415:projekte_im_wintersemester_2014_15:perlin3d.py-3dgen

perlin3D.py

#-*-coding:utf-8-*-
from __future__ import division
import math
import numpy
 
 
 
g = []
 
 
def noise(x, y, z):
    def interpolate(diff_x, diff_y, diff_z, w000, w001, w010, w100, w011, w101, w110, w111 ):
        def blending(x):
            return 10*x**3 - 15*x**4 + 6*x**5
        def lerp(t, a, b):
            return a + t * (b - a)
        blended_x = blending(diff_x)
        blended_y = blending(diff_y)
        blended_z = blending(diff_z)
        return lerp(blended_z, lerp(blended_y, lerp(blended_x, w000,w100), lerp(blended_x,w010,w110)),lerp(blended_y, lerp(blended_x,w001, w101),lerp(blended_x, w011, w111)))
    floored_x = int(math.floor(x))
    floored_y = int(math.floor(y))
    floored_z = int(math.floor(z))
    gradient000 = g[floored_x    ][floored_y    ][floored_z    ]
    gradient001 = g[floored_x    ][floored_y    ][floored_z + 1]
    gradient010 = g[floored_x    ][floored_y + 1][floored_z    ]
    gradient100 = g[floored_x + 1][floored_y    ][floored_z    ]
    gradient011 = g[floored_x    ][floored_y + 1][floored_z + 1]
    gradient101 = g[floored_x + 1][floored_y    ][floored_z + 1]
    gradient110 = g[floored_x + 1][floored_y + 1][floored_z    ]
    gradient111 = g[floored_x + 1][floored_y + 1][floored_z + 1]
    diff_x = x - floored_x
    diff_y = y - floored_y
    diff_z = z - floored_z
    w000 = gradient000[0] *  diff_x      + gradient000[1] *  diff_y      + gradient000[2] *  diff_z
    w001 = gradient001[0] *  diff_x      + gradient001[1] *  diff_y      + gradient001[2] * (diff_z - 1)
    w010 = gradient010[0] * diff_x       + gradient010[1] * (diff_y - 1) + gradient010[2] *  diff_z
    w100 = gradient100[0] * (diff_x - 1) + gradient100[1] *  diff_y      + gradient100[2] *  diff_z
    w011 = gradient011[0] *  diff_x      + gradient011[1] * (diff_y - 1) + gradient011[2] * (diff_z - 1)
    w101 = gradient101[0] * (diff_x - 1) + gradient101[1] *  diff_y      + gradient101[2] * (diff_z - 1)
    w110 = gradient110[0] * (diff_x - 1) + gradient110[1] * (diff_y - 1) + gradient110[2] *  diff_z
    w111 = gradient111[0] * (diff_x - 1) + gradient111[1] * (diff_y - 1) + gradient111[2] * (diff_z - 1)
    w = interpolate(diff_x, diff_y, diff_z, w000, w001, w010, w100, w011, w101, w110, w111)
    return w
 
def perlinnoise(x, y, z,f_min, f_max=0.5, phi=0.3, a=1, frequenz_faktor=2):
	summe = 0
	n = 0
	f = f_min
	a = 1
	while f <= f_max:
		summe += a*noise(f*x, f*y, f*z)
		n += 1
		f = f*frequenz_faktor
		a = phi=0.3*a
	return summe
 
def setmaxsize(breite):
    global g
    g = [[[(numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1), numpy.random.uniform(-1, 1)) for wertx in range(0,200)] for werty in range(0,200)] for wertz in range(0,200)]
ws1415/projekte_im_wintersemester_2014_15/perlin3d.py-3dgen.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)