Unity记录3.4-地图-柏林噪声生成 1D 地图及过渡地图

news2025/1/20 5:49:20

文章首发及后续更新:https://mwhls.top/4489.html,无图/无目录/格式错误/更多相关请至首发页查看。
新的更新内容请到mwhls.top查看。
欢迎提出任何疑问及批评,非常感谢!

汇总:Unity 记录

摘要:柏林噪声生成 2D 地图,以二维数组表示。

参考:
Unity 中文手册 2021.1
Unity 2D-Extras
Mathf.PerlinNoise

目录
1. 粗糙的 1D 柏林噪声-2023/03/17
2. 陡峭可控的 1D 柏林噪声-2023/03/17
改进思路-2023/03/17
3. 1D 柏林噪声过渡区域-2023/03/17-2023/03/18

1. 粗糙的 1D 柏林噪声-2023/03/17

  • 本来想一步到位,想想算了,脑子不够(拍了拍脑袋,发现空空的)。
  • 实现方式
    • 在取柏林噪声时,y 始终为 0,x 设为当前坐标即可。
  • 效果如下

Unity_011_PerlinNoise1d.png

  • 代码
    int[,] generate_perlin1d(int width, int height, int base_x, int base_y){
        int[,] offset_array = new int[width, height];
        float[] perlin_array = new float[width];
        float perlin_h;
        for (int i = 0; i < width; i++){
            perlin_array[i] = Mathf.PerlinNoise(((i + base_x) + 0.5f), 0.5f);
        }
        for (int i = 0; i < width; i++){
            perlin_h = perlin_array[i] * height;
            for (int j = 0; j < height; j++){
                if (j < perlin_h){
                    offset_array[i, j] = 1;
                }
            }
        }
        return offset_array;
    }

2. 陡峭可控的 1D 柏林噪声-2023/03/17

  • 效果(从左到右,scale分别为 10, 5, 1)

Unity_012_ScaleChange.png

  • 代码
    int[,] generate_perlin1d(int width, int height, int base_x, int base_y, float scale=10f){
        int[,] map_array = new int[width, height];
        float perlin_h;
        for (int i = 0; i < width; i++){
            perlin_h = height * Mathf.PerlinNoise(((i + base_x)/scale + 0.5f), 0.5f);
            for (int j = 0; j < height; j++){
                if (j < perlin_h){
                    map_array[i, j] = 1;
                }
            }
        }
        return map_array;
    }

改进思路-2023/03/17

  • 还好没有一步到位,做完之后发现做到这里就ok了。
    • 原本还想弄个噪声变化区域的高度占比,这样可以只在顶部变化,而底部始终填充,但做完发现没必要,直接和其它的叠起来就好。
    • 以及还有想弄陡峭程度的 scale,发现也没必要,越陡,整块面积也要越大,那直接把噪声的生成区域变大就好。
    • 以及多个噪声堆叠,现在想想真是无意义,噪声的叠加还是噪声。
  • 两个缺陷,不同 scale 与 y 时,区域不连续
    • 即当生成区域的 y 值变化,对应的噪声区域也会上下移动。但这可以通过增加一块过渡区,逐渐减少 y 值来解决,如下图
    • Unity_013_yChange.png
    • scale 的变化的话,感觉要计算一下原噪声位置,和新噪声位置,对齐才能实现。
    • 但似乎也能用过渡区域来实现。

3. 1D 柏林噪声过渡区域-2023/03/17-2023/03/18

  • 已知左区块高度及放缩,右区块高度及放缩,两区块间的 y 偏差,实现在两区块间加入过渡区域,让地图衔接平滑。

  • 思路很简单,原来是一大块区域用同一个高度和同一个放缩,现在过渡区域细分,每个x对应一个高度和放缩,以及y偏差,用三个斜率实现就行。

    • 和上面改进思路的图一样,上面只有 y 偏差,现在增加高度变化及放缩变化。
  • 效果:

    • 生成了四个区块,每个区块三个部分,左右两个正常地图,中间一个过渡地图,scale 从 10 5 间过渡,高度从 25 50 间过渡,偏差从 0 50 过渡
    • Unity_014_MapTransition.png
  • 三区块生成代码

        if (input_base.isKeydown("Fire3")){
            Vector3Int pos_tilemap = tilemap_modify.WorldToCell(input_base.get_mouse_pos(1));
            int[,] tmp_array = generate_perlin1d(tmp_w, tmp_h, pos_tilemap.x, pos_tilemap.y, scale:noise_scale);
            ArrayList pos_array = generate_pos_array(pos_tilemap, tmp_array);
            place_tile(tilemap_modify, pos_array, tile_place);
        pos_tilemap.x += tmp_w;
        pos_tilemap.y += Mathf.Min(0, tmp_h2);
        tmp_array = generate_perlin1d_transition(tmp_w2, tmp_h2, tmp_h, noise_scale, tmp_h3, noise_scale2, pos_tilemap.x, pos_tilemap.y);
        pos_array = generate_pos_array(pos_tilemap, tmp_array);
        place_tile(tilemap_modify, pos_array, tile_place);

        pos_tilemap.x += tmp_w2;
        pos_tilemap.y += Mathf.Max(0, tmp_h2);
        tmp_array = generate_perlin1d(tmp_w3, tmp_h3, pos_tilemap.x, pos_tilemap.y, scale:noise_scale2);
        pos_array = generate_pos_array(pos_tilemap, tmp_array);
        place_tile(tilemap_modify, pos_array, tile_place);</code></pre>
  • 过渡代码
    int[,] generate_perlin1d_transition(int offset_x, int offset_y,
                                        int height_left, float scale_left, 
                                        int height_right, float scale_right,
                                        int base_x, int base_y){
        int height, botton; 
        if (offset_y >= 0){
            height = Mathf.Max(height_left, height_right + offset_y);
            botton = 0;
        } else{
            height = Mathf.Max(height_left - offset_y, height_right);
            botton = offset_y;
        }
        int[,] map_array = new int[offset_x, height];
        float perlin_i, height_i, scale_i, offset_y_i;
        float k_scale = (scale_right - scale_left) / (float)offset_x;
        float k_height = (height_right - height_left) / (float)offset_x;
        float k_offset_y = (float)offset_y / (float)offset_x;
        for (int i = 0; i < offset_x; i++){
            // alignment height, transit from height_left to height_right
            height_i = height_left + k_height * i;  // perlin height
            scale_i = scale_left + k_scale * i;     // perlin scale
            offset_y_i = k_offset_y * i;            // perlin offset
            perlin_i = height_i * Mathf.PerlinNoise(((i + base_x)/scale_i + 0.5f), 0.5f);   // perlin y
            for (int j = 0; j < height; j++){
                if (j < perlin_i - botton + offset_y_i){
                    map_array[i, j] = 1;
                }
            }
    }
    return map_array;
}</code></pre>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细Redis入门教程——Redis概述

前言 本文小新为大家带来 超详细Redis入门教程——Redis概述 相关知识&#xff0c;具体内容包括Redis简介&#xff0c;Redis的用途&#xff0c;Redis的特性&#xff0c;Redis的IO模型&#xff08;包括&#xff1a;单线程模型&#xff0c;混合线程模型&#xff0c;多线程模型&am…

FPGA基于SFP光口实现1G千兆网UDP通信 1G/2.5G Ethernet PCS/PMA or SGMII替代网络PHY芯片 提供工程源码和技术支持

目录1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 目前网上的fpga实现udp基本生态如下&#xff1a; 1&#xff1a;verilog编写的udp收发器&#xff0c;但不带ping功能&#xff0c;这样的代码…

【部署】openvino2023环境配置

1. 下载 官网下载&#xff0c;我的选项如下&#xff1a; 2.配置 2.1. 在visual studio的配置 下载vs2017或者是vs2022 新建一个c项目。选择控制台应用视图–》解决方案资源管理器 在源文件下创建main.cpp文件视图–》其他窗口–》属性管理器 右键Release 添加新项目属性表…

RocketMQ单机环境搭建测试

1.资源下载 官网&#xff1a;下载 | RocketMQ 这里选择使用编译后可以直接用的 下载后解压&#xff1a;略 2.更改配置 主要是更改 conf/broker.conf 的配置&#xff0c;记得添加上下面这几行&#xff0c;否则消息发送失败 autoCreateTopicEnabletrue # 支持自动创建topic…

GitHub重量上线,开源分布式架构原理设计笔记分享

在分布式系统中&#xff0c;一次业务处理可能需要多个应用来实现&#xff0c;比如用户发送一次下单请求&#xff0c;就涉及到订单系统创建订单&#xff0c;库存系统减库存&#xff0c;而对于一次下单&#xff0c;订单创建与减库存应该是要同时成功或者同时失效&#xff0c;但在…

大气颗粒物PMF源解析

详情点击链接&#xff1a;大气颗粒物PMF源解析 一&#xff0c;PMF源解析技术及其输入文件准备 1、大气污染源解析方法有哪些&#xff1f; 2、这些方法各自应用的条件以及它们的优缺点&#xff1f; 3、大气颗粒物的基础知识及各组分的主要来源 大气颗粒物的来源&#xff1a…

逆序对问题的两种求解思路(归并排序和树状数组)

前言&#xff1a;我们在求解逆序对问题时题目往往会给我们加大数据量&#xff0c;防止我们以暴力的方式通过该题&#xff0c;所以在遇到有关求解逆序对问题的时候&#xff0c;我们有必要知道一些具体的优化方法&#xff0c;对于逆序对我们&#xff0c;我们一般的会有两种标准求…

Python实现GWO智能灰狼优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 灰狼优化算法(GWO)&#xff0c;由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能…

天猫数据分析软件(天猫销售数据如何查询)

俗话说得好&#xff1a;“知己知彼&#xff0c;百战不殆”。当前&#xff0c;在天猫店铺运营中&#xff0c;大家也非常注重数据分析&#xff0c;由此能够了解到竞争对手及整个行业的销售数据及销售趋势。 一、具体来讲&#xff0c;做好天猫数据分析有哪些益处呢&#xff1f; 1、…

pytorch 数据类型

文章目录一、tensor如何表示字符串数据类型类型判断Dimension 0Dimension 1Dimension 2Dimension 3Dimension 4mixed二、创建Tensorimport from numpyimport from listuninitialized 未初始化set default typerand/rand_like, randintfulllinspaceindex切片三、维度变换总结一、…

假期怕剧荒?五一假期追剧人正确打开方式

马上就是五一假期了 趁着假期必须狠狠刷剧才是我们追剧人正确的打开方式&#xff01; 追剧人&#xff0c;追剧魂 追剧人就是快乐多&#xff01; 俗话说&#xff0c;吃饭不能没有饭碗&#xff0c;那咱们追剧也不能没有好用的追剧平台啊&#xff01; 之前因为要一次性追好几部…

React styled-components (一) —— 基本使用

https://github.com/styled-components/styled-components styled-components 基本使用介绍优点缺点安装引入使用基本用法样式嵌套介绍 styled-components 是一个针对 React 的 css in js 类库。 和所有同类型的类库一样&#xff0c;styled-components 通过 js 赋能解决了原生…

教你如何搭建物业-办公管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍&#xff0c;如何搭建物业-办公管理。 1.2、应用场景 该应用包含停车、收费、投诉、通知、访客等管理功能。 2、设置方法 2.1、表单搭建 1&#xff09;新建表单【业主信息】&#xff0c;字段设置如下&#xff1a; 名称类型名称类型类型…

30天学会《Streamlit》(3)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第3天 - st.…

京东技术专家首推:微服务架构深度解析,GitHub星标120K

前言 微服务经过了长足的发展&#xff0c;在每个阶段所产生的信息都很多。在信息爆炸的当今&#xff0c;找到一本将信息梳理得井井有条的好书&#xff0c;是提升学习效率的最佳途径。 本书层次分明&#xff0c;分为原理篇、实践篇和进阶篇&#xff0c;适用于广泛的人群。理论…

电子商务客户保留策略:如何让买家回头

潜在客户转换是电子商务企业主的一大胜利。然而&#xff0c;在您成功将潜在客户转化为客户之后&#xff0c;可以而且应该采取无数步骤。购买后的有效营销应该是您的首要任务。 您可能知道&#xff0c;获取新客户的成本高于留住现有客户的成本。因此&#xff0c;制定客户保留策略…

毅硕科技携手Sentieon独家赞助第21届亚太生物信息学大会(APBC 2023)

APBC介绍 亚太生物信息学大会&#xff08;Asia Pacific Bioinformatics Conference, APBC&#xff09;是一年一度的行业国际盛会&#xff0c;汇聚区域间生物信息学领域的学者、研究人员和产业领导者&#xff0c;共同探讨生物信息学领域的研究进展、技术发展和应用创新。自2003…

分布式计算技术(下):Impala、Apache Flink、星环Slipstream

实时计算的发展历史只有十几年&#xff0c;它与基于数据库的计算模型有本质区别&#xff0c;实时计算是固定的计算任务加上流动的数据&#xff0c;而数据库大多是固定的数据和流动的计算任务&#xff0c;因此实时计算平台对数据抽象、延时性、容错性、数据语义等的要求与数据库…

银河麒麟V10操作系统之root密码重置

一、需求说明 从kingbase工程师那拷贝了一个已经安装了kingbase数据库环境的虚拟机&#xff0c;只有一个kingbase普通账户&#xff0c;root密码位置&#xff0c;且该账户未加入到sudo组中&#xff0c;无法执行新软件等的安装和部署。为了满足需要&#xff0c;我们需要重置root密…

测试5年,从纯手工测试到测试开发,我是怎么拿到腾讯25koffer的?

什么都做了&#xff0c;和什么都没做其实是一样的&#xff0c;走出“瞎忙活”的安乐窝&#xff0c;才是避开弯路的最佳路径。希望我的经历能帮助到有需要的朋友。 在测试行业已经混了5个年头了&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f…