了解 3D 柏林噪声
Understanding 3D Perlin Noise
我最近一直在研究使用二维柏林噪声的程序生成地形。我正在使用虚幻引擎4蓝图作为原型制作,但很快就会转移到C++。
我有一个顶点数组,用于构造二维平面。我在每个顶点上运行柏林噪声以获取随机噪声值,然后将其分配给该顶点的 Z 值。这产生了非常漂亮的地形;但它只是一架飞机。没有洞穴系统或任何类型的东西。这引起了我的兴趣。
我对3D Perlin Noise进行了一些研究,但我真的不明白它是如何工作的。3D 柏林噪声函数采用元素位置的 X、Y 和 Z 位置,并输出一个值。但是这个值有什么作用呢?2D 柏林噪声将值分配给第三维,那么 3D 函数是否将其分配给第四维?此值实际上如何应用于地形?
我对这个编程领域相当陌生,任何建议或知识将不胜感激。
3D 柏林噪声中的值本身没有任何内在意义。正如 2D 柏林噪点值不"执行"任何操作一样,您只能选择将其解释为高度值。
在地下使用3D柏林噪声的一种方法是,任何超过某个阈值(如0.8
)的值都将被视为"空"。
这是体素系统中 2d 柏林 + 3d 柏林随机地形的一个实现(伪代码)
bool IsVoxelEmpty(int x, int y, int z)
{
float flatPerlin = Get2DPerlin(x, z);
float terrainHeight = perlinToHeight(flatPerlin)
float thickPerlin = Get3DPerlin(x, y, z);
float threshold = 0.8f;
return (y > terrainHeight) || (thickPerlin > threshold);
}
使用这样的东西的一个缺点是会有许多"陨石坑"和洞穴向地表开放。您可以更改threshold
,以便在yPerlin
接近flatPerlin
时它变得更高,以便表面的孔数减少,并且通常只有在您突破表面后才能发现洞穴。
使用单纯的柏林噪音来生成洞穴的一个问题是,你会得到孤立的洞穴口袋,而且它们通常是彼此分开的。另一种方法是使用柏林蠕虫来生成洞穴网络。
相关文章:
- 在细胞中产生噪声 - CPP 和 GLSL
- 在没有密钥的情况下读取密文的剩余噪声预算
- 为什么这个噪声函数不处理否定参数?
- 如何使用中值滤波器算法去除胡椒噪声
- 使用Kalman滤波器来filt噪声,而不会延迟OpenCV C
- 如何创建用于生成噪声的哈希函数
- 了解 3D 柏林噪声
- 单纯噪声范围太小
- OpenCV噪声消除静态摄像机的视频
- 生成高斯噪声
- 实时图像处理:HSV图像中的噪声(openCV)
- 使用C 加入高斯噪声
- 用于跨平台(C /Android)无损/低噪声视频压缩/减压的库
- 如何获得粉红噪声的每倍频程功率(使用Aquila DSP库)
- 如何从xKinect视频中去除像素噪声
- 值噪声随机函数奇异输出
- 帧差噪声
- 信号扰动,C++正常噪声
- 柏林噪声和高度图/位图
- 如何减少或消除通过更改16位PCM采样'volume'而产生的噪声