1

当我尝试在程序中使用Perlin噪波时,它似乎只生成0.1到0.95之间的值。我检查了文档,并在网上进行了研究,试图解决我的问题,我认为问题可能是由于我在for循环中迭代x和y的方式造成的,但我不确定。

这里是MRE:

float width=平铺[0].transform.localScale.x;//此值为1float height=平铺[0].transform.localScale.z;//此值为1for(浮点x=0;x<map_width;x++)//map_wilth为100{for(浮点y=0;y<map_height;y++)//map_height=100{var perlin=数学。柏林噪声(x/10,y/10);调试。日志(perlin);//值介于0.1和0.95之间}}

当我尝试此代码时调试。原木(柏林);不得小于0.1或大于0.95。为什么?

1
  • 它的一部分源于您的计算,因此,您只是将整数添加到浮点中,所以,0,1,2,3,4。。然后除以10,那么对于perlin噪声来说,实际范围是0->10,这是一个很小的区域,如果你保持在100,并以0.1f为增量,我得到numebrs在-0.139和1.061之间。。。所以,这纯粹是它的结果 评论 6月14日6:30

1答案1

重置为默认值
4

你做得很好。所有的噪音都是这样的这与他们使用的算法无关,只是他们的本性,它们没有标准化为了适应某些事物,他们的种子必须是完美的,但这违背了目的,因为你需要随机性。

更多噪音示例:Simplex、Perlin、Worley(也依赖于距离函数,如曼哈顿或切比雪夫)、Value噪音等-它们都会产生有点不一定适合0-1的有界值。

对于我这一代人来说,我通常做0-1或-1到1的代数拟合。移位、乘法,然后将值钳制为0:1、-1:1,并将其硬编码到helper类中的某个位置。

当我组合来自不同或相同噪声(不同频率、振幅)的倍频程时,我通常会进行预计算拟合(寻找优化算法),运行1000次迭代以消除连续的1或0,这样它们就不会生成平面,并将这些修改器保存在缓存中,但这可能对您来说太过分了,因为我通常将算法移植到CUDA/GLSL/HLSL。

2
  • 我该如何改变频率和振幅?我试过了数学。柏林噪声(-x/10,y/10);但无济于事。 评论 6月14日10:59
  • 1
    周期函数中的频率和振幅描述如下:f(x,amp,fr)=amp*f(fr*x) 评论 6月14日11:13

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.