从灰度图到地形图

大概就是根据一个灰度图,生成一个地形。

分两步来实现吧;首先,用随机数生成地形;然后,根据灰度图生成地形。

小白,没啥基础,所以只能慢慢来。

参考:

【萌新图形学】地形网格生成入门 含动画说明哦_哔哩哔哩_bilibili

【萌新图形学】地形生成下篇——随机大地形与真实地形_哔哩哔哩_bilibili

首先,得有一些基本概念的:

00.一些基本概念

演示

我是个小白,所以,刚开始,来点直观的吧

新建了一个空物体gameobject,手动添加了3样东西给它:

  1. MeshFilter组件

  1. MeshRender组件

  1. 考虑到没有材质球会成粉色,所以新建了个默认的材质球给它。

前两个组件是主要的,下面的动图就简单的演示了这两个组件的作用。

顺便提一下,这里有个线框模式显示的开关。

大概有了个朦胧的认识:

  • MeshFilter里的Mesh可以控制物体的形状

  • MeshRender负责物体的显示

现在,开始文档里的正式介绍。

Mesh

Unity - Scripting API: Mesh (unity3d.com)

《inherits from Object》

里面按一定规则存着模型的数据,比如顶点什么的。【就是顶点着色器里的那个顶点】

看定义可能比较朦胧,看这个示例代码,就很清楚它是什么了:

MeshFilter

Unity - Manual: Mesh Filter component (unity3d.com)

这个组件,也很简单呐;里面就一个Mesh。。

具体可以这么用:

Unity - Scripting API: MeshFilter.mesh (unity3d.com)

从代码里可以看到,这个组件里的Mesh,就是上面的那个Mesh类

MeshRender

Unity - Manual: Mesh Renderer component (unity3d.com)

材质球,UnityShader,就是拖给这个组件的。再结合它的名字猜一下——它负责把网格画出来

小结

  • MeshFilterMeshRender是一对

  • MeshFilter组件和Mesh类是一对

  • 负责提供数据

  • 如顶点在模型坐标系下的坐标

  • MeshRender组件和材质球,shader是一对

  • 定义了如何使用数据

  • 比如在片元着色器里把quad给discard成ball,point sprite就是这么来的

后面就是按着视频来了。

01.大小为1的平面

这个是视频里的代码。

结合上面介绍的基本概念,大概知道它在干什么吧。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Terrian : MonoBehaviour
{public float width = 0.1f;MeshRenderer meshRenderer;MeshFilter meshFilter;// 用来存放顶点数据List<Vector3> verts;List<int> indices;private void Awake(){}private void Start(){verts = new List<Vector3>();indices = new List<int>();meshRenderer = GetComponent<MeshRenderer>();meshFilter = GetComponent<MeshFilter>();Generate();}public void Generate(){ClearMeshData();// 把数据填写好AddMeshData();// 把数据传递给Mesh,生成真正的网格Mesh mesh = new Mesh();mesh.vertices = verts.ToArray();//mesh.uv = uvs.ToArray();mesh.triangles = indices.ToArray();mesh.RecalculateNormals();mesh.RecalculateBounds();meshFilter.mesh = mesh;}void ClearMeshData(){verts.Clear();indices.Clear();}void AddMeshData(){verts.Add(new Vector3(0, 0, 0));verts.Add(new Vector3(0, 0, 1));verts.Add(new Vector3(1, 0, 1));verts.Add(new Vector3(1, 0, 0));indices.Add(0);  indices.Add(1);  indices.Add(2);indices.Add(0);  indices.Add(2);  indices.Add(3);}}

在上面的那个演示的基础上,把它拖给空物体,就可以了。

02.更大规模的平面

灌数据到Mesh的原理

主要就俩数组,一个是顶点,一个是索引。

视频里这个图挺好的。

顶点数据

索引数据

稍微复杂一点,因为顶点是单独的,这个是相互关联的。

很形象的图,涉及到二维逻辑地址和一维物理地址的换算。

从特殊到一般:

最终应用【顺序是比较重要的,因为单面剔除,cull on,cull off之类的】

试一试

修改前:

void AddMeshData()
{verts.Add(new Vector3(0, 0, 0));verts.Add(new Vector3(0, 0, 1));verts.Add(new Vector3(1, 0, 1));verts.Add(new Vector3(1, 0, 0));indices.Add(0);  indices.Add(1);  indices.Add(2);indices.Add(0);  indices.Add(2);  indices.Add(3);
}

修改后

void AddMeshData()
{int N = 10;//01填充顶点数据for (int z = 0; z < N; ++z)//按先x后z的顶点排列顺序,所以最外层的循环是z不是x{for(int x = 0; x < N; ++x){Vector3 temp = new Vector3(x, 0, z);verts.Add(temp);}}//02填充索引数据for(int z = 0; z < N - 1; ++z){for(int x = 0; x < N - 1; ++x){int index_lb = z * N + x;//index of the left bottom vertex. lb = left bottomint index_lt = (z + 1) * N + x;int index_rt = (z + 1) * N + x + 1;int index_rb = z * N + x + 1;indices.Add(index_lb);indices.Add(index_lt);indices.Add(index_rt);indices.Add(index_rt);indices.Add(index_rb);indices.Add(index_lb);}}
}

结果,符合预期;在原点那里放了个cube,作参照。

03.从平面到地形

这个不难,加一行

void AddMeshData()
{
int N = 10;
//01填充顶点数据
for (int z = 0; z < N; ++z)//按先x后z的顶点排列顺序,所以先循环的是z
{for(int x = 0; x < N; ++x){float height = Random.Range(0.1f, 1.0f);//随机加个高度Vector3 temp = new Vector3(x, height, z);verts.Add(temp);}
}
//02填充索引数据
for(int z = 0; z < N - 1; ++z)
{for(int x = 0; x < N - 1; ++x){int index_lb = z * N + x;//index of the left bottom vertex. lb = left bottomint index_lt = (z + 1) * N + x;int index_rt = (z + 1) * N + x + 1;int index_rb = z * N + x + 1;indices.Add(index_lb);indices.Add(index_lt);indices.Add(index_rt);indices.Add(index_rt);indices.Add(index_rb);indices.Add(index_lb);}
}}

结果,有高度起伏了。

这个是10*10规模的,更大的规模也是一样的。计算机擅长重复。

04.从随机数到灰度图

准备

首先,得有个地形灰度图;这里用的是这个:

其次,得能从C#脚本里读到纹理的值。

Unity - Scripting API: Texture2D (unity3d.com)

GetPixel函数

Unity - Scripting API: Texture2D.GetPixel (unity3d.com)

解释的很详细了:

从下图可以看出,这个xy不是归一化后的uv:

这个返回值color,倒是归一化的:Unity - Scripting API: Color (unity3d.com)

视频里用的是更快的这个函数:

Unity - Scripting API: Texture2D.GetPixels32 (unity3d.com)

但是,我是小白,能搞出来就已经是极限了,哪里还顾得上什么性能问题。

试一试

代码

接着改那个函数就行

void AddMeshData()
{int N = 100;//01填充顶点数据for (int z = 0; z < N; ++z)//按先x后z的顶点排列顺序,所以先循环的是z{for(int x = 0; x < N; ++x){int u = Mathf.FloorToInt(1.0f * x / N * texture2dHeightMap.width);//没归一化的uvint v = Mathf.FloorToInt(1.0f * z / N * texture2dHeightMap.height);float grayValue = texture2dHeightMap.GetPixel(u,v).grayscale;float height = grayValue*heightRatio;//灰度值范围是[0,1],所以得缩放一下Vector3 temp = new Vector3(x, height, z);verts.Add(temp);}}//02填充索引数据for(int z = 0; z < N - 1; ++z){for(int x = 0; x < N - 1; ++x){……//这部分是没改,省略}}
}

符合预期吧

完整的代码

新建一个空物体,上面添加上MeshFilter,MeshRender两个组件,然后把这个脚本拖给这个空物体,再点击play,大概就行了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Terrian : MonoBehaviour
{public Texture2D texture2dHeightMap;[Range(1,100)]public float heightRatio = 30.0f;//一个系数,控制地形总体的高度的MeshRenderer meshRenderer;MeshFilter meshFilter;// 用来存放顶点数据List<Vector3> verts;List<int> indices;private void Awake(){}private void Start(){verts = new List<Vector3>();indices = new List<int>();meshRenderer = GetComponent<MeshRenderer>();meshFilter = GetComponent<MeshFilter>();}private void Update(){Generate();}public void Generate(){ClearMeshData();// 把数据填写好AddMeshData();// 把数据传递给Mesh,生成真正的网格Mesh mesh = new Mesh();mesh.vertices = verts.ToArray();mesh.triangles = indices.ToArray();mesh.RecalculateNormals();mesh.RecalculateBounds();meshFilter.mesh = mesh;}void ClearMeshData(){verts.Clear();indices.Clear();}void AddMeshData(){int N = 100;//01填充顶点数据for (int z = 0; z < N; ++z)//按先x后z的顶点排列顺序,所以先循环的是z{for(int x = 0; x < N; ++x){int u = Mathf.FloorToInt(1.0f * x / N * texture2dHeightMap.width);int v = Mathf.FloorToInt(1.0f * z / N * texture2dHeightMap.height);float grayValue = texture2dHeightMap.GetPixel(u,v).grayscale;float height = grayValue*heightRatio;Vector3 temp = new Vector3(x, height, z);verts.Add(temp);}}//02填充索引数据for(int z = 0; z < N - 1; ++z){for(int x = 0; x < N - 1; ++x){int index_lb = z * N + x;//index of the left bottom vertex. lb = left bottomint index_lt = (z + 1) * N + x;int index_rt = (z + 1) * N + x + 1;int index_rb = z * N + x + 1;indices.Add(index_lb);indices.Add(index_lt);indices.Add(index_rt);indices.Add(index_rt);indices.Add(index_rb);indices.Add(index_lb);}}}}

后记

还想搞搞颜色,低的用绿色,高的用红色,中间用渐变色;更好的可视化一下;

但是,那个可能得写着色器。那很明显不是我这种小白干的来的。所以,忽略。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fragstats的土地利用景观格局分析

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容&#xff0c;其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制&#xff0c;并且通过调整人类社会经济活动&#xff0c;…

土壤类型、土壤质地、土壤养分空间分布

引言 全国土壤类型、质地、养分及变化等信息产品分为土壤类型数据、土壤质地数据、土壤养分数据及土壤变化数据等。该类产品是基于野外调查和实地采样&#xff0c;结合历史数据&#xff0c;建立全国土壤类型、质地、养分及变化等数据集&#xff0c;同时做成多种尺度的栅格数据。…

第三版全球干旱指数和潜在蒸散数据发布

Robert J. Zomer &#xff1b;JianchuXu&#xff1b;AntonioTrabucco(Kunming Institute of Botany, Chinese Academy of Science&#xff1b;Euro-Mediterranean Center on Climate Change, IAFES Division, Sassari, Italy) 摘要 潜在蒸散(Potential evapotranspiration&…

制作(土壤侵蚀度图,土地利用图、生态系统类型图,生境分布图)遥感解译模型方法.

最新《环境影响评价技术导则生态影响HJ19—2022》于2022年1月15日发布&#xff0c;2022-07-01正式实施&#xff0c;新导则颁布后&#xff0c;要求生态现状评价内容中基本图件构成包含&#xff1a;项目区域地理位置图、工程平面图、调查样方、样线、点位、断面等布设图、土地利用…

ArcGIS中的土地利用变化分析详解

本篇主要是针对矢量数据的分析。 一、不同时期的土地利用矢量数据&#xff0c;如何分析其图形及属性变化&#xff1f; 土地利用图&#xff08;左图为1993年&#xff0c;右图为2003年&#xff09; 思路如下&#xff1a; 可以先对2个图层进行Union操作&#xff0c;然后在结果中…

ArcGis实战:土地利用变化矩阵与土地利用变化图制作

目录 一、数据下载 &#xff08;1&#xff09;下载网站 &#xff08;2&#xff09;账号注册 &#xff08;3&#xff09;数据下载 二、图像预处理 (1)准备研究区矢量图层 (2)图像镶嵌 1.添加数据 2.去除黑边&#xff08;复制栅格&#xff09; 3.图像拼接&#xff08;图…

基于GMT绘制行政区划图

基于GMT6软件&#xff0c;在VS Code上简单绘制单独省份行政区划图&#xff0c;以广西为例。 数据源&#xff1a;中国地理数据空间集&#xff0c;中国国界省界数据。 set GMT_SESSION_NAME97401 gmt begin GDO pnggmt set MAP_GRID_PEN_PRIMARY 0.25p,gray,2_2gmt coast -R103…

GPT模型应用丨遥感云大数据在灾害、水体与湿地领域典型案例实践

​ ​ ​ ​ 第一部分 基础实践 一 平台及基础开发平台 GEE平台及典型应用案例介绍&#xff1b; GEE开发环境及常用数据资源介绍&#xff1b; ChatGPT、文心一言等GPT模型介绍 JavaScript基础简介&#xff1b; GEE遥感云重要概念与典型数据分析流程&#xff1b; …

Google Earth Engine(GEE)下载全球土壤砂粒(Sand)含量数据

数据介绍&#xff1a; SoilGrids&#xff0c;是一个全球土壤属性地图&#xff0c;现在可以通过GEE下载。 SoilGrids是ISRIC–世界土壤信息的一个项目&#xff0c;旨在提供一个全球一致的、由数据驱动的系统&#xff0c;以预测土壤性质&#xff0c;并将其作为一项重要指标。该项…

利用ArcGIS做一张土地利用现状图

利用ArcGIS做一张土地利用现状图 首先我们打开ArcGIS加载进来三调数据&#xff0c;这是镇的数据&#xff0c;现在我们需要村的行政边界。首先打开属性表添加一个新的字段命名“行政代码”字段属性为文本&#xff0c;文本长度保持默认。 在行政代码列打开字段计算器输入Left(…

PIE-engine 教程 ——荒漠化程度提取案例分析(陕北区域)

这里我们利用ndvi进行荒漠化处理&#xff0c;我们这里将ndvi小于0.1的地方进行淹没掉&#xff0c;将剩余部分作为作为荒漠化的区域。这里选择时间的筛选我们将4月到10月的的时间作为研究时间。这里我们有几个函数需要需要先了解一下&#xff0c;首先是我们了解画polygon的函数&…

【乌鲁木齐】基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【原文链接】&#xff1a;【乌鲁木齐】基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247545692&idx1&sn1934aa8be717557c6c97c6b5e2a49151&chksmfe68f5…

自然资源(国土)部门通用坐标TXT转SHP的FME方法

一、任务来源 经常遇到提供了TXT坐标需要转成矢量&#xff0c;然后去跟其他数据做分析统计的情况&#xff0c;最典型的就是原国土资源部门&#xff08;现在的自然资源部门&#xff09;在各种系统中用到的TXT坐标格式&#xff0c;它们的本质爱基本都是相同的&#xff0c;有的根据…

电商评论文本情感分类(中文文本分类+中文词云图)(第一部分-textcnn)

电商评论文本情感分类(中文文本分类中文词云图) 第一部分 第二部分Bert部分 本项目包含&#xff1a; 1.中文文本处理 2.中文词云图绘制 3.中文词嵌入 4.基于textcnn的中文文本分类&#xff08;Test_Acc89.2000&#xff09; 5.基于bert的中文文本分类&#xff08;Test_Acc0.…

详解升讯威在线客服系统前端多国语言实现技术:原生支持葡文、印尼文、土耳其文、俄文

我在业余时间开发维护了一款免费开源的升讯威在线客服系统&#xff0c;也收获了许多用户。对我来说&#xff0c;只要能获得用户的认可&#xff0c;就是我最大的动力。 越来越多的用户向我提出需求&#xff0c;希望为访客端增加更多的界面语言&#xff0c;如葡文、印尼文、土耳其…

【NLP论文翻译】基于显著性感知主题建模的面向主题的客户服务口语对话摘要

本博客为博主论文阅读记录&#xff0c;原论文和github地址如下&#xff1a; 原论文下载&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/17723/17530 代码&#xff1a;https://github.com/RowitZou/topic-dialog-summ 本篇博客所介绍论文为AAAI 2021论文 NLP领域…

ChatExcel 来了,太酷炫了!

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 每天 14:00 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应…

本周最火AutoGPT!GitHub3.6万+标星,解决复杂任务全程无需人类插手

金磊 丰色 发自 凹非寺量子位 | 公众号 QbitAI 本周AI圈”最红炸子鸡“诞生——AutoGPT。 不仅如此&#xff0c;这款软件系统的横空出世&#xff0c;一举将AI进程推向了新高度—— 自主人工智能。 顾名思义&#xff0c;它所具备的能力主打的就是一个“自主”&#xff0c;完全不…

智慧园区如何搭乘数字孪生这列快车?

无论是2022年的火爆的元宇宙还是今年出圈的ChatGPT&#xff0c;都体现着数字技术嵌入社会生活是大趋势&#xff0c;数字孪生作为智能技术的一大亮点&#xff0c;它在智慧园区中的应用会是怎样呢&#xff1f;今天我们就来聊一聊&#xff01; &#xff08;全文3000字&#xff0c;…

超详细!简单的物联网模块esp8266接入小爱爱同学控制电器(一)——控制开关灯

简单的物联网模块esp8266接入小爱爱同学控制电器&#xff08;一&#xff09;——控制开关灯 闲来无事&#xff0c;分享一个简单使用的物联网实现系统&#xff08;小爱同学esp8266&#xff09;&#xff0c;实现手机控制开关灯小爱同学控制开关灯 1.准备材料&#xff1a; 1.1 …