Unity记录3.3-地图-柏林噪声生成 2D 地图

news2024/11/14 10:55:10

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

汇总:Unity 记录

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

目前时间复杂度是O(H*W),和地图大小成正比,但都是可以同步的操作,有人知道如何加速吗?

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

目录
鼠标右键区域随机生成地图-2023/03/12
1. 粗糙的柏林噪声生成 2D 地图-2023/03/12
2. 随机的比例自定的 2D 柏林噪声-2023/3/15
3. 区域固定的的比例自定的 2D 柏林噪声-2023/3/15
4. 尺度可变的区域固定的的比例自定的 2D 柏林噪声-2023/3/15
长宽搞反了-2023/03/17

鼠标右键区域随机生成地图-2023/03/12

  • 最近事儿多,今天算是有空来搞这个。
  • 效果是右键点击,生成随机值为 0 1 的 10×10 的数组,并以鼠标位置为起点生成 tile。
    • 只要把这个数组替换成柏林噪声生成的数组就能实现更美观的地图了。
  • 不过在想要做一个 tile 字典时出了问题,没找到如何获得所有 tile,只能自己指定。
    • 我还想弄成 {ID, Name, Tile} 这种呢…

1. 粗糙的柏林噪声生成 2D 地图-2023/03/12

  • 参考:
    • unity柏林噪声生成2d随机地图
    • Mathf.PerlinNoise only returns the float 0.4652731 at every given position
  • 第一篇参考实际上没啥作用,不过我是照着它写的。
  • 简单介绍一下:
    • 柏林噪声的图大家应该都见过,没见过的去 Unity 手册看看:https://docs.unity.cn/cn/2021.3/ScriptReference/Mathf.PerlinNoise.html
    • 每个位置的像素值与相邻位置的像素值相近,并且按照相同的梯度改变。
    • 返回值区间为 [0, 1],所以我们如果拿 0.5 作为阈值,那原本较白的地方就会变得纯白,较黑的地方不变。
    • 这种截断类似对山峰的截断,我们留下某个高度以上,如下面效果图,有 tile 的地方就是山峰,没有 tile 的地方就是被截断掉的。
  • 函数注意点:
    • 输入浮点数,输出值域 [0, 1]。
    • 输入整数时,函数始终输出 0.4652731。
  • 效果如下图

Unity_08_PerlinNoise2d.png

  • 代码如下:
int[,] generate_perlin2d(int height, int width){
    int[,] offset_array = new int[height, width];
    float thres = 0.3f;
    for (float i = 0; i < height; i++){
        for (float j = 0; j < width; j++){
            if (Mathf.PerlinNoise(i/height, j/width) < thres){
                offset_array[(int)i, (int)j] = 1;
            }
        }
    }
    return offset_array;
}

2. 随机的比例自定的 2D 柏林噪声-2023/3/15

  • 将传入 PerlinNoise 的坐标随机偏移,即可得到随机的柏林噪声。
  • 将噪声用不同的比例过滤,可得到比例不同的噪声。
    • 比例与噪声面积呈正相关,但斜率不是一条直线,为了减少不必要的计算量没有用排序来获得实际阈值位置。
  • 选择大于或小于某值的噪声,可得到噪声的山峰部分与山谷部分
  • 效果如下:

Unity_09_BasinAndMountain.png

  • 代码如下:
    int[,] generate_perlin2d(int height, int width, float thres_prob=0.1f, bool cropHigh=false){
        /// <summary>
        /// Generate 2d perlin noise, by crop a field of perlin noise.
        /// cropHigh True: get mountain. cropHigh: get basin.
        /// </summary>
        int[,] offset_array = new int[height, width];
        float[,] perlin_array = new float[height, width];
        float perlin_max = 0f;
        float perlin_min = 1f;
        float field_x = Random.Range(0, 1000);
        float field_y = Random.Range(0, 1000);
        float perlin_x, perlin_y;
        // perlin noise array
        for (float i = 0; i < height; i++){
            for (float j = 0; j < width; j++){
                perlin_x = field_x + i / height * 10f;
                perlin_y = field_y + j / width * 10f;
                float perlin_noise = Mathf.PerlinNoise(perlin_x, perlin_y);
                perlin_array[(int)i, (int)j] = perlin_noise;
                perlin_max = Mathf.Max(perlin_max, perlin_noise);
                perlin_min = Mathf.Min(perlin_min, perlin_noise);
            }
        }
    float thres_value = (perlin_max - perlin_min) * thres_prob + perlin_min;
    for (int i = 0; i &lt; height; i++){
        for (int j = 0; j &lt; width; j++){
            if ((perlin_array[i, j] &lt; thres_value &amp; cropHigh) | (perlin_array[i, j] &gt; thres_value &amp; !cropHigh)){
                offset_array[i, j] = 1;
            }
        }
    }
    return offset_array;
}</code></pre>

3. 区域固定的的比例自定的 2D 柏林噪声-2023/3/15

  • 和 2.随机的比例自定的 2D 柏林噪声 的效果差不多,但对于指定坐标,在不改变生成比例的前提下,每次的柏林噪声都是固定的。
    • 也就是我用鼠标左键生成地图,那么不论我怎么拖动鼠标,都只会在没有地图的地方生成新的,且过渡自然。
  • 代码如下,base_xbase_y 表示区域的基坐标,即鼠标点击的位置。
    int[,] generate_perlin2d(int height, int width, int base_x, int base_y, float thres_prob=0.5f, bool cropHigh=false){
        /// <summary>
        /// Generate 2d perlin noise, by crop a field of perlin noise.
        /// cropHigh True: get mountain. cropHigh: get basin.
        /// </summary>
        int[,] offset_array = new int[height, width];
        float[,] perlin_array = new float[height, width];
        float perlin_max = 0f;
        float perlin_min = 1f;
        float perlin_noise;
        for (int i = 0; i < height; i++){
            for (int j = 0; j < width; j++){
                perlin_noise = Mathf.PerlinNoise((i+base_x)/10f, (j+base_y)/10f);
                perlin_array[i, j] = perlin_noise;
                perlin_max = Mathf.Max(perlin_max, perlin_noise);
                perlin_min = Mathf.Min(perlin_min, perlin_noise);
            }
        }
    float thres_value = (perlin_max - perlin_min) * thres_prob + perlin_min;
    for (int i = 0; i &lt; height; i++){
        for (int j = 0; j &lt; width; j++){
            if ((perlin_array[i, j] &lt; thres_value &amp; cropHigh) | (perlin_array[i, j] &gt; thres_value &amp; !cropHigh)){
                offset_array[i, j] = 1;
            }
        }
    }
    return offset_array;
}</code></pre>

4. 尺度可变的区域固定的的比例自定的 2D 柏林噪声-2023/3/15

  • 相较于 3. 区域固定的的比例自定的 2D 柏林噪声,现在的区域尺度可变,由 scale 控制,即原来的区域可能有 20 个山峰,scale 乘 10 后,山峰数量可能减少至 2 个。
    • 缺点是如果 scale=1 时,那同一区域山峰和山谷叠加后可能无法覆盖整个区域。
    • 为了解决整数问题,统一加了 0.5 偏置。
  • 效果如下,左下角 scale=1,右下角 scale=5,左上角 scale=10,右上角 scale=50

Unity_010_ScaleChange.png

  • 代码如下:
    int[,] generate_perlin2d(int width, int height, int base_x, int base_y, float scale=10f, float thres_prob=0.5f, bool cropHigh=false){
        /// <summary>
        /// Generate 2d perlin noise, by crop a field of perlin noise.
        /// cropHigh True: get mountain. cropHigh: get valley.
        /// </summary>
        int[,] offset_array = new int[width, height];
        float[,] perlin_array = new float[width, height];
        float perlin_max = 0f;
        float perlin_min = 1f;
        float perlin_noise;
        for (int i = 0; i < width; i++){
            for (int j = 0; j < height; j++){
                perlin_noise = Mathf.PerlinNoise(((i+base_x)/scale + 0.5f), ((j+base_y)/scale + 0.5f));
                perlin_array[i, j] = perlin_noise;
                perlin_max = Mathf.Max(perlin_max, perlin_noise);
                perlin_min = Mathf.Min(perlin_min, perlin_noise);
            }
        }
    float thres_value = (perlin_max - perlin_min) * thres_prob + perlin_min;
    for (int i = 0; i &lt; width; i++){
        for (int j = 0; j &lt; height; j++){
            if ((perlin_array[i, j] &lt; thres_value &amp; cropHigh) | (perlin_array[i, j] &gt; thres_value &amp; !cropHigh)){
                offset_array[i, j] = 1;
            }
        }
    }
    return offset_array;
}</code></pre>

长宽搞反了-2023/03/17

  • 不好意思,HWC 看多了,下意识把坐标也 HWC 了,实际上是 xy 坐标,也就是 WH
    • 换句话说,前面的代码,除了 4. 尺度可变的区域固定的的比例自定的 2D 柏林噪声 是我刚刚修正过的,其它的 height 实际上是 width,width 则是 height。

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

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

相关文章

再学C语言51:C库中的字符串函数(3)

一、strcpy()函数 功能&#xff1a;复制字符串&#xff0c;在字符串中的作用等价于赋值运算符 示例代码&#xff1a; /* test of strcpy() function */ #include <stdio.h> #include <string.h>int main(void) {char arr1[] "Easy doesnt enter into grow…

基于html+css的图片展示19

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【AI生产力工具】Midjourney:为创意人士提供创造性灵感和支持的工具

文章目录 一、Midjourney是什么&#xff1f;二、Midjourney的优势三、Midjourney的应用四、结语 在现代社会&#xff0c;创意和创新成为越来越重要的能力。然而&#xff0c;创意灵感的获取却不是一件容易的事情&#xff0c;这就需要我们使用一些辅助工具来帮助我们发现和实现创…

照片尺寸怎么修改,3大工具推荐

照片尺寸怎么修改&#xff1f;对于许多人来说&#xff0c;调整图片的尺寸可能是一个日常任务&#xff0c;无论是个人或者工作上都可能会遇到这个需求。适当地调整图片的尺寸可以让图片更具专业性和美观性&#xff0c;而且能够减小文件大小&#xff0c;提高图片的加载速度。在电…

2023年4月北京/西安/郑州/深圳CDGA/CDGP数据治理认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

如何用 Leangoo领歌做迭代规划及迭代执行。

迭代是敏捷开发的核心&#xff0c;正确的迭代可以帮助敏捷团队提高工作交付速度&#xff0c;今天&#xff0c;我们深度看下如何用Leangoo领歌敏捷工具进行迭代规划和迭代执行&#xff0c;高效落地 Scrum。 1、确定迭代需要做的需求 在需求看板中&#xff0c;将已经梳理好的用…

C++ -3- 类和对象 (中) | 构造函数与析构函数(一)

文章目录 1.类的6个默认成员函数2.构造函数3.析构函数构造函数与析构函数应用场景缺省值初始化 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自…

网络安全必学渗透测试流程

这个靶场是一个对渗透新手很友好的靶场。而且&#xff0c;该靶场包含了渗透测试的信息收集&#xff0c;漏洞利用和权限提升的全过程&#xff0c;对新手理解渗透测试的流程有很好的帮助。 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmHundred 靶场基本情…

关系数据库(查询优化)

选择操作的实现select * from student where Sno201212128; 简单的全表扫描法优点&#xff1a;对于小表简单有效 缺点&#xff1a;对于大表顺序扫描浪费时间效率低下索引扫描方法 连接操作的实现 连接操作是查询处理中最耗时的操作之一 select *from student,sc where s…

云上数据变革:Databend Cloud 正式发布

2023 年 4 月 20 日&#xff0c;Databend Cloud 经历了近两年的打磨终于发布了&#xff01;&#x1f389; 此次发布会由北京数变科技有限公司【Databend Labs】联合阿里云共同举办。Databend Cloud 借助于云原生数仓 Databend 实现了云简单易用的大数据分析场景。 以下内容来…

Python语言中的注释方法应用

Python语言中的注释方法 在Python编程中&#xff0c;与其他编程语言一样&#xff0c;有良好的注释部分&#xff0c;会让你的程序在后续的改进或优化中&#xff0c;变得便利。同时&#xff0c;给自己培养了良好的编程习惯。 在Python语言中&#xff0c;有两种注释方法。 1.单行…

报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果?

导读 语言模型给我们的生产生活带来了极大便利&#xff0c;但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。 在3月9日智源Live第33期活动「DetectGPT&#xff1a;判断文本是否为机器生成的工具」中&#xff0c;主讲人Eric为我…

API Testing 一个基于 YAML 文件的开源接口测试工具

API Testing 一个基于 YAML 文件的开源接口测试工具&#xff0c;同时支持运行在本地、服务端。 在选择工具时&#xff0c;可以从很多方面进行考量、对比&#xff0c;以下几点是该工具的特色或者优点&#xff1a; 开源与否&#xff0c;atest 采用 MIT 开源协议&#xff0c;是最流…

传智教育“大同互联网职业技术学院”奠基仪式盛大举行,开拓高等职业教育发展新版图

2023年4月20日&#xff0c;大同市“数字经济职业教育发展论坛暨大同互联网职业技术学院奠基仪式”在大同隆重举行。论坛由中共大同市委、大同市人民政府主办&#xff0c;大同市教育局、传智教育承办&#xff0c;并全程在多平台进行线上直播。 大同市委副书记、市长张强&#x…

学生成绩管理系统winform+SqlServer

主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 学生选课&#xff0c; 可以查询个学期各科成绩 查看或者选择选课信息 显示当前课表&#xff0c;管理员后台管理 开设课程 课程查询&#xff08;上课时间和地点&#xff09; 录入该课程下的…

【Java】jieba结巴分词器自定义分词词典 超详细完整版

发现一款很轻量好用的分词器->结巴分词器 分享给大家 不仅可以对常规语句分词&#xff0c;还可以自定义分词内容&#xff0c;很强大&#xff01;&#xff01; 源码地址&#x1f449;&#xff1a;https://github.com/huaban/jieba-analysis 简单使用 如果是常规的语句&#…

transformer与vit

transformer结构&#xff0c;位置编码复现 https://wandb.ai/authors/One-Shot-3D-Photography/reports/-Transformer—Vmlldzo0MDIwMjc 训练部分 https://nlp.seas.harvard.edu/2018/04/03/attention.html#training transform训练代码从0构建 https://blog.csdn.net/BXD1…

全注解下的SpringIoc 续1

上篇文章介绍了ioc的基本用法和ComponentScan注解的使用&#xff0c;这篇文章我们来看看依赖注入的部分。 提起依赖注入&#xff0c;想必大家肯定会想到Autowired注解&#xff0c;的确&#xff0c;它是我们用的最多的一个。 还记得容器的顶级接口BeanFactory 吗&#xff0c;它定…

微信开发者工具使用git提交项目至gitee远程仓库(保姆级)

1. 开始 1.1. 点击进入gitee官网 进入主页之后,根据图片右上角点击新建仓库 输入自定义仓库名称, 访问路径点击创建仓库 这里不要点击初始化文件, 复制Git远程仓库路径 打开微信开发者工具,新建项目什么的就不多说了,打开项目,根据图片所示, 点击版本管理弹出窗口, 点击远程…

代码生涯冲常见的的bug.例如layui表格中日期自动生成、eacharts 报表的重复点击事件

1、layui表格中日期不受控制的自动生成&#xff0c;这种情况往往是你设置了日期类型的强转 例 对于这种情况你需要定义templet模板 1、 {field: outtime, title: 离开时间,templet : "#time"} 2、 <script type"text/html" id"time"> …