[英]How to use noise to generate varied terrain biome style
我目前正在使用值噪声,我相信它会与布朗分形运动结合使用,以在3D环境中生成地形。 我从噪声生成2D高度图,其值介于-1和+1之间。 我通常只将返回值乘以10左右即可设置高度,并产生起伏的丘陵。
我想做的是以某种方式组合对算法的调用,以使某些区域非常丘陵,其他区域相当平坦,而有些区域则接近山区。 您如何进行这样的操作而区域之间没有明显的边缘(如将悬崖隔开的突起)?
编辑:这需要在几乎无限的环境中完全程序化。
基于ananthonline的回答,我正在将低频呼叫作为噪声发生器作为屏蔽。 对于两种生物群落类型,我采用了生物群落的“影响”,减去掩模值的绝对值减去掩模上的“位置”,然后将整个值再除以“影响”值。
(影响-Abs(遮罩-位置))/影响
这给了我一个值,当为正值时,我可以乘以具有特定频率,幅度等(例如起伏的丘陵,高山或海洋)的特定噪声调用的返回值。
这里的主要问题是,例如,如果我的面罩返回值0到1,则我需要(在两个生物群落场景中)将一个生物群落的位置设置为.25,将另一个生物群落的位置设置为.75,强度为.5。每个人都可以正确地融合在一起。 至少,如果我想平均分配每种生物群系类型并将其正确混合在一起。 如果我想让山脉的出现频率比起起伏的丘陵高出两倍,我会付出很多努力。
我这样做是希望的。 数学的计算效果非常好,但我当然不能以有限的数学背景和知识来很好地解释数学。 也许一些代码会有所帮助(如果我粗鲁的未注释代码对某人有意义),请注意,GetNoise2d返回0到1之间的值:
float GetHeight(float X, float Z)
{
float fRollingHills_Location = .25f, fRollingHills_Impact = .5f, fRollingHills = 0;
float fMountains_Location = .75f, fMountains_Impact = .5f, fMountains = 0;
float fMask = GetNoise2d(0, X, Z, 2, .01f, .5f, false, false);
float fRollingHills_Strength = (fRollingHills_Impact - Math.Abs(fMask - fRollingHills_Location)) / fRollingHills_Impact;
float fMountains_Strength = (fMountains_Impact - Math.Abs(fMask - fMountains_Location)) / fMountains_Impact;
if (fRollingHills_Strength > 0)
fRollingHills = fRollingHills_Strength * (GetNoise2d(0, X, Z, 2, .05f, .5f, false, false) * 10f + 25f);
if (fMountains_Strength > 0)
fMountains = fMountains_Strength * (GetNoise2d(0, X, Z, 2, .1f, .5f, false, false) * 25f + 10f);
return fRollingHills + fMountains;
}
如果需要指定上述代码的问题,那么假设要使用10个不同的生物群系来执行此操作,则需要考虑一些极端的想法才能将其准确地输入到“位置”和“影响”值中,从而确保混合无瑕。 我宁愿以某种方式对其进行编码,以确保已经处理完了。
如何在比地形纹理小1/8或更小的纹理中生成低频噪声(白黑),然后对其进行模糊处理,然后将其用作遮罩,将两个高度图混合在一起(也许是渲染算法本身的一部分) )?
请注意,您也可以手动绘制此“混合”纹理,从而可以精确控制悬崖与平滑过渡区域(更陡峭的边缘与模糊的边缘)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.