1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 无缝大世界之无缝连接Terrain转mesh

无缝大世界之无缝连接Terrain转mesh

时间:2023-12-06 00:31:33

相关推荐

无缝大世界之无缝连接Terrain转mesh

目录

Terrain转Mesh介绍

2、实现方案

3、技术原理

(1)Terrain转Mesh

(2)减面生成多层LOD

Terrain转Mesh介绍

Unity传统的Terrain面数是非常恐怖的存在,且会产生大量的Draw Call和Terrain Data,内存大加载耗时等,它们都会导致性能的极大消耗,不适合在实际项目中使用,因此Terrain转Mesh诞生。

本篇文章介绍的方案与传统的转mesh有所不同,这次转mesh是针对无缝大世界所准备,一下将会介绍方案和技术实现原理。

实现方案

在真实大世界中,由于地图通常都是好几k以上,这么大一块地图用一两块完整的地形拼接往往不现实,因此需要分开多块,而考虑到性能问题,在离视线比较远的地形块精度是不需要太高,这样就出现了每块地形都有几层的LOD,由于远一点显示的LOD精度不一样,这样会导致两块不同LOD级别的地形边界上的顶点不一致导致穿透问题。

本篇文章介绍解决法:只要保证每块LOD级别的边顶点数目一样,这样就能达到无缝连接。

实现过程:

Terrain转成mesh转mesh的同时自定义边顶点数目,并对边做智能化减面转完mesh后,利用减面算法或者减面工具在保证边顶点不被减少的情况进行减面,这种减面生成多层lod。

技术原理

Terrain转Mesh

如下图,在转之前,首先将地形的顶点分开成5个部分处理,其中4个部分分别是4条边,因为转了mesh之后,在生成多层lod的时候边顶点是不能变才能达到无缝连接,为了避免后面lod层级边数量太多,所以做一下合理的智能减点。

1.第1~4部分

存储结构:顺序列表有序将顶点存入

技术细节:根据自己设置的边顶点数量,平均划分好顶点并排列存入结构,这种均匀减点最后效果如图所示。

然后再经过智能减点算法再次减少顶点个数,原理根据设置两条相邻边夹角大小判断是否减点,原理非常简单。

这种智能减点后效果如下图所示。

2.第5部分

存储结构:两个顺序结构组成的动态二维数组,行和列也根据图中顺序存入

3.三角形构建

顺时针绘制三角形,法线方向遵从左手法则(Unity的规则)。

第5部分构建:由于行和列的顶点一一对应,因此三角形的构建非常简单,相邻4个顶点构建2个三角形依次完成。

第1、3部分构建:自身边与第5部分最靠近的边进行构造三角形,算法自动适配构造。

第2、4部分构建:自身边与第5部分最靠近的边进行构造三角形,其中四个角落四个顶点在1、3的列表里,因此算法做一点更改就可以了。

4.UV设置

每个点的UV存储顺序必须与顶点存储顺序一致。

自身0~1UV设置:因为地形是由数个相等的正方形组成的一个大正方形或大长方形,因此UV可以根据顶点在当前矩阵上的位置除以矩阵的大小得到。

由于最后一层级一般离玩家视野较远,因此该级别的地形贴图可以不需要那么复杂,直接用一张缩略图就行啦,缩略图是整个大地形唯一一张共用的图。

大地形0~1UV设置:大地形共用一个材质球一张大贴图时,例如下图中地形为:2*2,那么UV设置将在自身UV基础上除2加上UV偏移值。

图2-3 UV相对设置

以上构建思想均是我所给出的5个结构存储顶点相关数据的构造方式,可以参考。

减面生成多层LOD

方案:

1、在已有减面工具基础做

2、自己实现减面工具。

首先是使用已有减面工具,这种要找到能够保证边顶点不被任何修改的减面工具才可以,自己外层包装一下就好了,这种做法剪出来效果如下图所示。

从下图可以看到不同lod的无缝连接,这就是保证边不被减少的效果。

自己实现减面

用减面插件没什么好讲的,这就讲一下如何自己减面,看我另外一篇文章:/qq_33700123/article/details/113894702,只要实现了自己减面差不多也相当于实现了一个减面插件,然后包装一下就ok啦。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。