加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

3d – 受限景观的程序生成

发布时间:2020-12-15 21:48:03 所属栏目:大数据 来源:网络整理
导读:我想实现一个程序生成的地形. 经过深入研究后,我得出一个结论,它应该采用梯度(相干)噪声生成算法之一,例如Perlin噪声算法. 但是,我不希望这一代完全随机.我想应用一些限制(比如应该是山脉,或者应该是低地等). 题: 例如,我有一条代表一些景观元素的曲线.曲线
我想实现一个程序生成的地形.
经过深入研究后,我得出一个结论,它应该采用梯度(相干)噪声生成算法之一,例如Perlin噪声算法.
但是,我不希望这一代完全随机.我想应用一些限制(比如应该是山脉,或者应该是低地等).

题:

例如,我有一条代表一些景观元素的曲线.曲线是一系列点.

>我如何改进Perlin Noise算法,以便这样做
曲线噪声将具有一个优选的值范围(或者,对于
简单,价值0)?
>或者,如果我有一个纹理
输出Perlin Noise算法(2d数组),我该如何转换它
达到理想的噪音(受曲线影响)?

解决方法

How can I improve the Perlin Noise algorithm,so that along this curve the noise will have a preferred range of values (or,for simplicity,value 0)?

这可以通过将地图中的每个像素通过简单的p – >转换来实现. f(p)数学函数.

考虑一个函数,它将紫色线映射到蓝色曲线 – 它强调较低的位置高度以及非常高的位置高度,但使它们之间的过渡更陡峭(这个例子只是一个余弦函数,使得曲线不太平滑会使转型更加突出).

您也可以只使用曲线的下半部分,使峰值更锐利,更低的位置区域更平坦(因此更具可玩性).

曲线的“锐度”可以通过功率(使效果更加显着)或平方根(降低效果)轻松调节.

实现这个实际上非常简单(特别是如果你使用余弦函数) – 只需在地图中的每个像素上应用该函数.如果函数在数学上不是那么简单,那么查找表就可以正常工作(在表值之间使用三次插值,线性插值会产生伪像).

(从我的aswer复制到another question)

如果您只需将生成的噪声转换为已知值范围(如-1.0 – 1.0),请使用此算法:

function scaleValuesTo(heightMap,newMin,newMax)
{
    var min = min(heightMap);
    var range = max(heightMap) - min;
    var newRange = newMax - newMin;

    for each coordinate x,y do:
        hrightMap[x,y] = newMin + (heightMap[x,y] - min) * newRange / range;
    end for
}

I’d like to apply some constraints (like where should be a mountain range,or where should be a lowland etc.).

这有点复杂,因为您需要指定山脉的位置.最简单的解决方案是创建一个单独的高度图(您可以在程序上执行此操作或从位图加载它,无关紧要),并使用所需地形的粗略形状,然后将其与噪声贴图一起添加.有几点需要注意:

1)确保模板地图上没有锐边(这些边缘在组合地图上非常明显).盒子模糊通常足以达到此目的,尽管像高斯模糊这样的更复杂的滤镜会产生更好的效果(在某些情况下,盒子模糊会在地图上保留一些锐利的边缘).

2)您可能希望在较高海拔的情况下优先考虑噪声地图,在较低海拔地区优先考虑较低的优先级.这可以通过这样的操作轻松实现:combinedMap [x,y] = templateMap [x,y](0.2 0.8 * templateMap [x,y])* noiseMap [x,y].

您可以在此图表中看到此方法:

(我为自己的terrain generation project做了这个)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读