Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++如何实现一个简单的程序化生成(Procedural Generation)算法_c++柏林噪声应用【游戏开发】_创想鸟

c++如何实现一个简单的程序化生成(Procedural Generation)算法_c++柏林噪声应用【游戏开发】

柏林噪声是一种可重复、平滑连续、可缩放的伪随机函数,适合生成自然地形与纹理;其核心是通过哈希坐标获取梯度、双线性插值及fade函数实现平滑过渡,并支持fbm多层叠加模拟多尺度特征。

c++如何实现一个简单的程序化生成(procedural generation)算法_c++柏林噪声应用【游戏开发】

用 C++ 实现简单的程序化生成,核心是用柏林噪声(Perlin Noise)生成自然、连续、可重复的伪随机地形或纹理。它比纯随机数更“有机”,适合做地形高度图、云层、火焰、纹理扰动等。

一、先理解柏林噪声的关键特性

柏林噪声不是“随机”,而是:
可重复:相同坐标输入,永远返回相同浮点值(利于多线程或重载世界);
平滑连续:输出值在空间中渐变,没有突兀跳跃;
可缩放(octave 控制):通过叠加不同频率/振幅的噪声层(fbm),模拟山脉、小丘、岩石细节等多尺度特征。

二、手写一个轻量级 2D 柏林噪声(适合学习和小项目)

不依赖外部库,用经典 Ken Perlin 原始思路简化实现(非最高效,但逻辑清晰):

定义一个 256 项的随机排列表(perm),用于哈希坐标 → 随机梯度方向;对每个整数格子角点预设一个单位梯度向量(如 (1,1), (-1,1) 等);对输入点 (x, y),找到它所在的单位格子(floor(x), floor(y));计算该点到四个角点的向量,并与对应梯度点乘,得到四个“影响值”;用平滑插值函数(如 3t²−2t³)混合这四个值,得到最终噪声值 ∈ [-1, 1]。

代码片段(精简版,含注释):

#include #include #include 

class SimplexNoise { // 注:这里用“SimplexNoise”名更准确,但初学可用 Perlin 思路理解std::vector perm = { / 256 个 0~255 的 shuffle 后排列 / };

float fade(float t) { return t * t * t * (t * (t * 6 - 15) + 10); }float lerp(float a, float b, float t) { return a + t * (b - a); }float grad(int hash, float x, float y) {    int h = hash & 3;    float u = h < 2 ? x : y;    float v = h < 2 ? y : x;    return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);}

public:SimplexNoise() {std::vector p(256);for (int i = 0; i

float noise(float x, float y) const {    int X = (int)floor(x) & 255;    int Y = (int)floor(y) & 255;    x -= floor(x); y -= floor(y);    float u = fade(x), v = fade(y);    int A = perm[X] + Y, AA = perm[A] & 255, AB = perm[A+1] & 255;    int B = perm[X+1] + Y, BA = perm[B] & 255, BB = perm[B+1] & 255;    float x1 = grad(perm[AA], x, y);    float x2 = grad(perm[BA], x-1, y);    float y1 = lerp(x1, x2, u);    float x3 = grad(perm[AB], x, y-1);    float x4 = grad(perm[BB], x-1, y-1);    float y2 = lerp(x3, x4, u);    return lerp(y1, y2, v);}// fbm:叠加多层噪声(octaves)float fbm(float x, float y, int octaves = 4, float lacunarity = 2.0f, float persistence = 0.5f) const {    float total = 0.0f;    float frequency = 1.0f;    float amplitude = 1.0f;    float norm = 0.0f;    float sum = 0.0f;    for (int i = 0; i < octaves; ++i) {        sum += noise(x * frequency, y * frequency) * amplitude;        norm += amplitude;        amplitude *= persistence;        frequency *= lacunarity;    }    return sum / norm;}

};

立即学习“C++免费学习笔记(深入)”;

三、生成地形高度图(2D 数组示例)

用 fbm 填充一个 128×128 的 heightmap:

遍历每个 (i, j),映射为世界坐标(如 i*0.05f, j*0.05f);调用 fbm(x, y),结果归一化到 [0.0, 1.0] 或 [-0.5, 0.5];可加偏移/缩放控制山峰高度,例如:height[i][j] = (fbm(i*0.03f,j*0.03f) + 0.7f) * 0.5f;;后续可按高度阈值划分:0.6→岩石/雪地。

四、实用技巧 & 注意事项

种子控制:把 perm 表的 shuffle 种子(如 default_random_engine(1234))换成可配置参数,就能切换不同世界;性能优化:实际项目建议用开源库如 webgl-noise 的 C++ 移植版 或 stegu/perlin-noise,支持 SIMD 和 3D/4D;避免“网格感”:确保采样间距远小于噪声基频(比如用 0.01–0.05 缩放因子),否则会看到明显方块;结合其他技术:噪声输出可作为 mask 输入到 Voronoi、Worley 噪声,或驱动 Marching Squares 生成等高线。

基本上就这些。从一个可运行的 fbm 函数开始,再叠加规则(如河流侵蚀、生物群系分布),就能搭建出有表现力的程序化世界。不复杂但容易忽略的是——噪声只是“原料”,真正让生成有意义的,是你怎么解释和组合它。

以上就是c++++如何实现一个简单的程序化生成(Procedural Generation)算法_c++柏林噪声应用【游戏开发】的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++如何实现一个自定义内存分配器_C++为STL容器提供定制化的Allocator
上一篇 2025年12月19日 11:26:23
C++ vector push_back与emplace_back的区别_C++对象插入的性能优化
下一篇 2025年12月19日 11:26:35

相关推荐

  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    100
  • Java集合框架在数据处理中的应用实例

    使用Set去重:通过LinkedHashSet去除标签重复并保持顺序;2. Map统计频次:利用HashMap统计单词出现次数;3. List结合Comparator排序:按年龄升序、姓名降序排列用户;4. 集合嵌套处理数据:用Map组织部门与员工列表。集合框架提升数据处理效率与代码可读性。 Jav…

    2026年9月21日
    000
  • 如何使用XGBoost训练AI大模型?优化机器学习模型的步骤

    XGBoost并非用于训练GPT类大模型,而是擅长处理结构化数据的高效梯度提升算法,其优势在于速度快、准确性高、支持并行计算、内置正则化与缺失值处理,适用于表格数据建模;通过分阶段超参数调优(如学习率、树深度、采样策略)、结合贝叶斯优化与交叉验证,并配合特征工程、数据预处理和集成学习等关键步骤,可显…

    2026年9月21日
    000
  • MySQL性能模式监控资源_MySQL瓶颈定位精确工具

    MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具MySQL性能模式监控资源_MySQL瓶颈定位精确工具

    mysql性能模式通过事件记录精准定位瓶颈,核心步骤包括:1.启用并配置performance schema,选择性开启消费者和仪器;2.监控等待事件、sql语句、阶段、i/o、内存及锁等关键指标;3.分析events_waits_summary_global_by_event_name等表识别资源…

    2026年9月21日 用户投稿
    000
  • 《最终幻想7重生》制作人力挺NS2钥匙卡!开发者受益匪浅

    《最终幻想7重生》的联合制作人滨口直树(Naoki Hamaguchi)在最近接受Wccftech采访时,对任天堂Switch 2引入的游戏钥匙卡(Game Key Card)表达了积极态度。 他不仅回应了围绕该设计的争议,还大胆预测任天堂未来将大力推动这一新格式的发展,并指出其为游戏开发团队带来的…

    2026年9月21日
    000
  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    100
  • REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    如果说redmi过去是“性价比之王”,那么这一次,它彻底进化成了“性能怪兽”。10月23日即将登场的redmi k90 pro max,不仅是品牌年度旗舰的压轴大戏,更是其历史上首款冠以“pro max”之名的巅峰之作。 这可以看作是REDMI向高端市场发起冲击的正式宣言。卢伟冰亲自放话:“给4K价…

    2026年9月21日 用户投稿
    300
  • Windows11提示“应用程序无法正常启动(0xc000007b)”怎么解决_Windows11应用程序启动0xc000007b修复方法

    首先使用SFC工具修复系统文件,再重新安装Visual C++运行库,接着更新DirectX组件,最后可借助专用DLL修复工具解决0xc000007b错误。 如果您尝试在Windows 11上启动某个应用程序,但弹出“应用程序无法正常启动(0xc000007b)”的错误提示,则可能是由于系统文件损坏…

    2026年9月20日
    100
  • vivo浏览器设置选项在哪里_vivo浏览器系统设置入口位置

    首先打开vivo浏览器,点击右上角三点图标进入设置菜单;也可通过首页滑动侧边栏或搜索框输入“设置”快速跳转,进而调整搜索引擎、隐私权限及清除缓存等配置。 如果您在使用vivo浏览器时需要调整浏览设置,例如更改默认搜索引擎、管理隐私权限或清除缓存数据,可以通过浏览器内置的系统设置入口进行操作。以下是进…

    2026年9月20日
    100
  • mac怎么合并多个PDF文件_Mac合并PDF文件方法

    使用macOS可便捷合并PDF:1. 用预览拖拽缩略图或插入文件;2. 通过访达快速操作批量合并;3. 借助在线工具如iLovePDF处理。 如果您需要将多个PDF文件整合为一个文档以便于分享或管理,macOS系统提供了多种便捷的合并方式。以下是一些有效的操作步骤: 本文运行环境:MacBook P…

    2026年9月20日
    000
  • 如何为VSCode配置C++开发环境?

    答案:配置VSCode的C++环境需安装MinGW-w64编译器并添加到PATH,安装C/C++和可选Code Runner扩展,创建.c_cpp_properties.json、tasks.json和launch.json文件以配置编译器路径、编译任务和调试设置,最后通过编译运行测试代码验证配置成…

    2026年9月20日
    100
  • order by排序在mysql中如何实现

    ORDER BY用于对查询结果排序,支持ASC升序和DESC降序,位于SELECT语句末尾,可按单列或多列排序;MySQL优先利用索引有序性避免排序,若无合适索引则采用filesort在内存或磁盘排序;优化器选择单路或双路排序以提升效率;性能关键包括为排序字段建立索引、避免大结果集无索引排序、减少S…

    2026年9月20日
    000
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • Linux如何将进程放入后台运行

    将Linux进程放入后台运行主要有四种方法:使用&amp;amp;amp;amp;amp;amp;amp;符号在启动时放入后台;通过Ctrl+Z暂停后用bg继续运行;结合nohup与&amp;amp;amp;amp;amp;amp;amp;防止会话关闭导致终止;使用screen或tm…

    2026年9月20日
    000
  • 在Java中如何实现多条件排序

    使用Comparator.thenComparing()可实现多条件排序,如先按年龄升序、再按分数降序、最后按姓名升序排列。 在Java中实现多条件排序,通常可以通过 Comparator 接口来完成。你可以根据多个字段依次比较,优先级从高到低排列。以下是几种常用且清晰的实现方式。 使用 Compa…

    2026年9月20日
    200
  • 怎样在VSCode中重命名变量或文件?

    使用F2键可快速重命名变量或文件,VSCode会自动更新符号引用,支持多语言,重命名文件时需注意导入路径可能需手动调整。 在 VSCode 中重命名变量或文件非常方便,可以通过内置的重构功能快速完成,同时保持代码的一致性。 重命名变量(符号重命名) 当你想重命名代码中的变量、函数或类时,VSCode…

    2026年9月20日
    100
  • 企查查如何使用快捷查询栏_企查查查询栏的自定义配置教程

    首先启用快捷查询栏,再添加自定义模板如“高新技术企业_北京”,设置行业、地区等条件并保存,随后调整模板顺序以优化访问效率,最后可编辑或删除不再需要的查询配置。 如果您希望在企查查中快速查找企业信息,但每次手动输入查询条件较为繁琐,可以通过配置快捷查询栏来提升效率。通过自定义查询栏的显示字段和默认筛选…

    2026年9月20日
    000
  • 《时间旅者:重生曙光》试玩版惊现登场 ,万圣节85折 特惠来袭!

    由知名开发商Bloober Team倾力打造的全新科幻生存恐怖游戏《时间旅者:重生曙光(Cronos: The New Dawn)》现已推出免费试玩版,同步登陆Steam与Epic Games Store!值此万圣节前夕,玩家可率先体验约30分钟的紧张冒险,深入这个令人着迷又毛骨悚然的末世世界。与此…

    2026年9月20日
    100
  • 如何在Laravel中实现数据排序

    在laravel中实现数据排序的核心方法是使用eloquent查询构建器的orderby方法。1. 基础排序可通过orderby指定字段及方向,如按创建时间倒序排列;2. 可使用latest()和oldest()分别实现倒序和正序排列;3. 多字段排序通过链式调用多个orderby方法实现,如先按姓…

    2026年9月20日
    100
  • 蛙漫2(日版)(网页版)在线登录 蛙漫2(日版)入口通道

    蛙漫2(日版)在线登录入口为https://manwa2.com/,该平台汇集日漫、国漫等多类型高清漫画,涵盖校园、恋爱、冒险等题材,支持每日更新、智能推荐、夜间模式及书架同步等功能。 蛙漫2(日版)在线登录入口通道在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来蛙漫2(日版)最新网页版访…

    2026年9月20日
    100

发表回复

登录后才能评论
关注微信