Unity高程图生成
创始人
2024-05-27 01:49:02
0

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

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

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

参考:

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

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

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

一些基本概念

演示

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

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

  1. MeshFilter组件

  1. MeshRender组件

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

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

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

大概有了个朦胧的认识。现在,开始文档里的正式介绍。

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,就是拖给这个组件的。再结合它的名字猜一下——它负责把网格画出来

小结

  • MeshFilter组件和Mesh类是一对

  • 负责提供数据

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

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

  • 定义了如何使用数据

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

后面就是按着视频来了。

1*1的平面

这个是视频里的代码。

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Terrian : MonoBehaviour
{public float width = 0.1f;MeshRenderer meshRenderer;MeshFilter meshFilter;// 用来存放顶点数据List verts;List indices;private void Awake(){}private void Start(){verts = new List();indices = new List();meshRenderer = GetComponent();meshFilter = GetComponent();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);}}

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

更大规模的平面

灌数据到Mesh的原理

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

视频里这个图挺好的。

顶点数据

索引数据

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

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

从特殊到一般:

最终应用

试一试

修改前:

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,作参照。

从平面到地形

这个不难,加一行

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规模的,更大的规模也是一样的。计算机擅长重复。

源自灰度图的地形

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...