欢迎光临散文网 会员登陆 & 注册

柏林噪声简化版地形生成算法js版代码

2023-04-25 11:39 作者:阿-岳同学  | 我要投稿

不依赖任何其他模块的js代码,方便随时取用,直接复制到项目非常方便:



介绍

柏林噪声是一种能够生成连续、无缝的随机分布的算法。它由 Ken Perlin 在 1983 年创建,常用于生成自然风景、云彩、水波等图像。在《我的世界》游戏中,柏林噪声算法被用于生成游戏世界中的地形。具体来说,每个游戏世界都是由一个大方块网格 组成的,每个小方块都有一个高度值。柏林噪声算法可以根据小方块的位置坐标来生成 一个对应的高度值,以此来生成具有自然形态的山丘、河流、峡谷等地形特征。这种 生成方式使得每个游戏世界都具有随机性和独特性,让玩家感受到更加真实的游戏体验。

传入不同的参数,将高频的噪声和低频的噪声叠加在一起形成丰富的地形,遍历棋 盘上的每一个位置对应的叠加后的噪音网络中的噪音值,即可获得整个地形。


侧视图示意图


俯视图示意图

将低于绿色平面的部分表示草地,将高于绿色的部分表示为石头。以此可以用js来做一些小东西、小游戏。

利用这个地形算法作出的小游戏的效果


具体代码细节


在这个代码中,外层函数 createRandom(seed) 返回了一个内层函数。每次调用这个 内层函数,它都会修改外层函数中的变量 value。这个 value 变量可以被认为是一个状 态,记录了当前的随机数生成器所处的状态。 由于 JavaScript 的函数都是对象,当内层函数被返回后,外层函数的执行环境就会 被销毁,但是它的局部变量 value 会一直存在于内层函数的闭包中,因此不会被垃圾回 收。 这个 value 变量的作用就是存储随机数生成器的状态,从而可以保证在每次调用内 层函数时,返回的随机数都是按照确定的算法生成的。 为了在编写代码时区分各个噪音网络的种子,要使得种子参数可以使字符串,这就需要实现以下将字符串哈希化的方法:


此方法使用了基本的数学运算来实现哈希函数,该函数将字符串 str 中每个字符的 ASCII 码值相加,再乘以一个质数 31,最后对一个质数取余数,得到哈希值。 虽然可以实现字符串转哈希值的功能,但哈希冲突的情况比较多,对于需要高效处 理大量数据的场景,使用一些成熟的哈希函数库更加合适,由于此模式的地图相对较小, 只有 19x19,所以采用了相对简单的方式实现。 在此函数中使用了哈希算法中的常见技巧——乘法哈希法,即将当前哈希值乘上一 个常数后加上新加入的字符,这个常数被称为“乘数”,一般取一个质数,乘数的选取 影响哈希算法的性能。 在这里,31 是一个较为常见的乘数,因为它是一个奇素数,而且 hash * 31 可以 被优化为位运算 hash << 5 - hash,这样可以提高计算速度,同时生成的哈希值分布也比 较均匀,避免哈希冲突。



温馨提示

以上文字说明其实是为了凑字数,因为代码不能算入字数,导致代码不能发表,这些文字由chatGPT根据代码来生成。

由于up把建模软件maya给卸载了,本文的前两张示意图由up“在下叶凉陈”帮忙绘制。




柏林噪声简化版地形生成算法js版代码的评论 (共 条)

分享到微博请遵守国家法律