//Description: 程序化地形生成
//Create Date: 2021-05-15 17:19:39
//Author: channy
最终目标为生成全局地形vBox,地貌种类为n,包括如下部分:
基本思路:
fastnoise library - a noise library contains most of classical noise
用各种noise可以生成地形高度图,但无法生成复杂结构如山洞等
Making maps with noise functions
其中Perlin noise被广泛应用,可以用Perlin噪声生成三维噪声图,[-1,1]分布,根据每个空间点的噪声正负确定该点是否是地形的一部分(marching cubes 网格化算法)
常用于生成平滑的地形
2d perlin noise可生成高度图,3d perlin noise可生成立体图
分形噪声本质上是基础噪声的叠加,如Perlin + fbm多用于生成山地地形
(Fractal Noise is any noise which produces a fractal)
参数说明:
amplitude: 噪声振动幅度,影响噪声的最大最小值
frqueency: 频率
octaves: 分形数,影响平滑度。The level of detail. Lower = more peaks and valleys, higher = less peaks and valleys.
lacunarity: 倍数,间隙度。The level of detail on each octave (adjusts frequency).
gain: 增益。How much an octave contributes to overall shape (adjusts amplitude).
效果:对整个地形进行分割成区域,每个区域一种地形(平原、山地…);或用于平原粗糙化分裂
2d Voronoi基本图形生成
n个随机点vCenters(最后分割成的区域个数及中心点)
对图中每个像素点,查找最近的vCenters
over
2d Voronoi高度图生成
对图中的每个像素点,knn查找最近的k个点,计算到这k个点的加权距离,作为高度
2d Voronoi图边界粗糙化
level2, f(n) > n 个随机点vHCenters
对图中每个像素点,查找最近的vHCenters
对查找到的vHCenters,查找最近的vCenters
根据目标像素到最近中心点的距离确定高度,距离有Eular距离等
每个数组元素(Voxel)保存的不再是高度值,而是一个近似的距离值(iso-value)或密度值SDF,表示这个点有多大程度在土地里或暴露在空气中。
Andrew / Quickhull
Euclidean Use the Euclidean distance metric
Manhattan Use the Manhattan distance metric.
Chebychev Use the Chebychev distance metric.
Minkowski Use the Minkowski distance metric.
CGAL 使用LGPL和GPL协议
[ALGLIB]
[Eigen]
//fast_noise_lite
//set noise type
noiseLite.SetNoiseType(NoiseType_Perlin);
noiseLite.SetFractalType(FractalType_Ridged);
//set noise params
noiseLite.SetFrequency(0.01);
noiseLite.SetFractalGain(0.5);
noiseLite.SetFractalOctaves(7);
noiseLite.SetFractalLacunarity(1.0/1.75);
noiseLite.SetFractalWeightedStrength(2);
在地图上生成蜿蜒河流的两种方法 Polygonal Map Generation for Games
bi-linear interpolation
对voxel中的data进行滤波
^
| A--------B
| | |
| | P |
| | |
| C--------D
Y
*X------------>
// This could be different depending on how you get points
// (basically generates a [0, 1] value depending on the position in quad;
px = P.x - (int)P.x
py = P.y - (int)P.y
AB = A.h * (1.0 - px) + B.h * px;
CD = C.h * (1.0 - px) + D.h * px;
ABCD = AB * (1.0 - py) + CD * py;
笔刷形状:圆平面、正方形平面、球体、立方体、圆柱体…… 笔刷大小:1不一定有效,因为一个单位立方体最多只生成一个点,一个点不足以表示复杂多面体 材质:自动材质 锚点:鼠标打到地形表面的点处于形状的位置 锁定平面:是否根据地形表面的法线确定笔刷平面是垂直于法线还是保持鼠标刚点下时所在的平面不变 锁定方向:增长/侵蚀特有 强度: