失真,无缝噪音以及如何使用它们。我们产生一个星球
产生行星的最简单方法之一就是使用噪声。 如果我们决定选择它,那么我们有两个可能的选择。 让我们看一下并确定最佳方案:
- Perlin Noise是最简单的选择。 Perlin噪声由Ken Perlin于1983年开发,它具有两个缺点-视觉伪影,与生成大图像时的其他选项相比,速度较慢。
- 单纯噪声(Simplex Noise) -由Ken Perlin于2001年开发,旨在消除Perlin噪声的缺陷; 这是一个非常有价值且快速的解决方案,但有一个严重的缺点:专利保护了三维单纯形噪声的使用,这使其非常昂贵。
- 开放式单纯形噪声 -KDotJPG的开发目标很简单:创建相对简单且无失真的现代且免费的单纯形噪声版本。
在这三者中,我个人更喜欢在个人项目中使用的Open Simplex Noise。 值得注意的是,在当前的OpenSimplexNoise实现中
,将需要进行其他工作才能轻松访问
音阶,八度和生成器 。 互联网上有很多有关这些元素的作用的信息,我强烈建议您进行研究。 但是,在我的文章中,我不会谈论这一点。
这是16个八度音阶的Open Simplex Noise的样子。无缝噪音
噪音是无穷无尽的,这意味着如果我们简单地创建纵横比为2:1的画布以获得
相等间距的投影 ,那么当它
叠加在一个球体上时,它就不会循环(我对这个令人惊叹的网站表示感谢),而是在水平接缝和两极巨大的差异。
无接缝产生噪音。注意将噪声应用于球体时出现的巨大接缝。有很多方法可以解决此问题。 例如,
在 Red Blob Games的一篇
出色文章中 [使用Habré进行翻译 ] ,使用一个函数接收一个到中心的距离作为变量,并在边缘将高度设置为0以最小化接缝,就足以生成一个孤岛。
但是,这不是我们所需要的。 我们要生成一个可能存在北极和南极的行星,为此,我们将需要更复杂的数学计算。
球形覆盖
可以生成球形行星的方法是将画布的笛卡尔坐标转换为球形坐标,基于这些坐标生成噪声,然后将噪声转换回笛卡尔坐标并将其应用于画布。
但是,此实现有其局限性,其原因在
Ron Valstar的
精彩文章中得到了说明 。 最重要的是,在这种情况下,大陆的形状看起来极为奇怪和扭曲,因此我们将不使用此选项。
球形噪声叠加。 奇怪的形状和扭曲使这些大陆变得丑陋。但是至少没有更多的接缝了。三次叠加
结果,我使用了第二种方法,该方法取自Ron Valstar的帖子以及acko
Making Worlds的一系列文章。 他们通过立方体的产生及其“膨胀”来描述地球的产生,就好像它是气球一样,直到它成为球体形状的一个例子。
图片来自acko.net。 它以一种简单的可视化方式解释了立方图的概念。现在我们只需要生成六张脸,这很简单,有很多方法可以做到这一点。
最后,我决定创建一个数组,并用数据填充它。 我将画布的2D坐标转换为立方体的3D坐标,然后为这些3D坐标中的每一个生成噪声,以便将它们保存到相应的2D坐标值。
这样,我们可以创建一个三次方地图,
使用Bartosz编写的精彩代码可以轻松将其转换为等距投影。
算法生成立方图。三次地图的等距变换。在maptoglobe.com上渲染的立方地图地球仪。如您所见,等距图具有更漂亮的形式,并且当叠加在球体上时,它会产生类似于球体叠加的结果,而没有所有缺点。 顺便说一下,等距投影可以通过不同程序(例如
NASA G.Projector)轻松转换为几乎任何类型的卡。
总结
生成整个星球似乎是一项艰巨的任务,尽管正确使用噪声是一种非常强大的工具,但它也存在着人们已经面临多个世纪的自身问题,例如将地球仪覆盖在2D画布上且失真最小。
我提出的解决方案创建了非常粗略的生成的行星,这些行星没有考虑构造板块,河流,岛屿连山脉甚至山脉,因此只能用作演示或作为更复杂模拟的基础。
实际上,它仅在一定值范围内创建值矩阵。 对于灰度图像,该值为0-255。 然后将这些值转换为像素,该像素创建类似于第一张灰度图像的图像,或者转换为-11000至8000范围内的图像以模拟真实世界的高度差,然后根据高度间隔对像素进行着色
(例如,值从0开始5用沙色上色以模拟海岸) 。
在建立宇宙时,上帝使用了更高层次的数学。
-保罗·狄拉克(Paul Dirac)