乐趣区

关于游戏开发:UE4Unity绘制地图基础元素面和体

前言

基于 UE4/Unity 绘制地图根底元素 - 线(上篇)

基于 UE4/Unity 绘制地图根底元素 - 线(下篇)

搞定地图画线之后,接下来就是绘制面和体了:

面作为地图渲染的根本元素之一,在地图中能够代表各种模式的区域,例如海面、绿地等。面数据通常以离散点串模式存储,因而渲染时最关注的是如何将其展示为闭合的图形。

体能够了解为带有高度的面,在地图中代表各种修建,通常是由其顶部面数据和高度数据处理失去。

本文记录了绘制面和体的流程以及解决闪动问题的计划。

绘制多边形区域面

面数据通常以离散点串模式存储,面的绘制与线的绘制原理相似。渲染的根本单位是三角形,线是通过扩大线宽结构三角形后渲染,而面是通过将多边形拆分为多个三角形后渲染。

拆分为三角形的过程被称为三角剖分,罕用的三角剖分算法是耳切法(Ear Clipping),比拟成熟的计划是 Mapbox 的 earcut,对于有 [公式] 个顶点的多边形,其工夫复杂度为 [公式],值得注意的是,三角剖分的解可能是不惟一的,任何一种剖分形式都可能渲染失去面,但细小的三角形更容易使面中的同一像素绘制屡次,造成适度绘制(Overdraw),因而依据多边形特色做一些剖分秩序的调整能够作为一个优化点。

剖分实现的多边形区域,在指定了每一个顶点的色彩之后,就能绘制失去纯色的面。和道路线的 Z -fighting 问题相似,区域面也须要解决同一高度叠加显示的问题。同时,二维的道路线和区域面整体也处于同一个高度上,因而也须要对立思考层级关系,将所有的道路线置于区域面之上。对立解决实现就能够失去二维的地图底板了。

绘制多边形修建体

二维地图底板实现后,就轮到地图上的楼块修建了。为了缩小数据量,通常的存储形式是顶面点串和其对应的拔起高度,在渲染时减少顶点形成闭合体。

顶面渲染流程和闭合区域面统一,侧面则是依据楼高进行绘制,在每两个相邻顶点间渲染一个矩形从而形成闭合体的侧面,为了缩小绘制次数通常只绘制朝向外侧的侧面,底面在失常视角下看不到,也能够酌情抉择是否绘制。

修建体的渲染只比区域面多了拔高产生的侧面,逻辑比较简单,解决失去所有三角形数据后,配置好顶点色彩即可实现渲染。

奇怪的修建体 Z -fighting 问题

实践上来说,修建体数据的顶面通常不会重合,因而在拔起渲染后不会呈现 Z -Fighting 问题,但奇怪的是,渲染后依然发现一些体存在侧面闪动问题。通过全链路的排查,才查出是多边形数据的问题。

三角剖分在应用时有一个前置条件:应用对象必须为简略多边形,即多边形中的任何两条边仅能够在顶点处相交。下图 (a) 多边形为满足定义的简略多边形,图 (b) 多边形边 01 和 23 在非顶点处相交,因而是非简略多边形。

对于非简略多边形,应用三角剖分只能得出较为称心的后果,但不能保障其正确性。从下图四个顶点形成的非简略多边形的三角剖分后果能够看到,多边形渲染时会失落顶点并且产生谬误的三角形,无奈还原数据真实情况。

依照这种想法对现有数据进行了边的相交检测,的确存在一小部分的多边形不是简略多边形。而体元素的立面拔起是依照原始数据在每一组相邻顶点间绘制矩形,因而会产生问题。以上述的非简略多边形(b)为例,边 12 拔起生成矩形 1245,边 23 拔起生成矩形 2364,两个侧面矩形在面 1245 上齐全重合,当外立面贴上不同的纹理后就会产生 Z -Fighting 景象。同时,因为外立面仅仅绘制朝向外侧一面,面 1245 在对侧查看时会隐没,产生十分诡异的成果。

针对这个问题,比拟容易想到的解决办法次要是以下三个:

1、间接过滤,简略粗犷。

2、依据多边形计算外接矩形,缩小细节

3、依据三角剖分后果剔除多余顶点,从新生成简略多边形

以上三个计划对于多边形的细节保留由少到多,但并不是齐全还原实在数据。尤其对于一些简单修建,某一个面的谬误会导致最终拼装失去的渲染后果谬误。因而比拟现实的形式是修复非简略多边形,将其合成为多个简略多边形,别离渲染还原细节。

简略多边形的断定与修复

依据简略多边形的定义,很容易想到采纳暴力解法进行断定:一个 边形有 条边,每条边只须要和其余的 条不相邻边判断是否相交即可达到目标,其工夫复杂度为 ,对于仅须要进行一遍数据荡涤的静态数据来说曾经足够。但对于须要实时处理的动态数据来说,其须要遍历所有组合,尤其对于可能仅存在大量相交点的状况,冗余计算太多,因而能够引入工夫复杂度更低的相交断定算法进行解决。

对于一个非简略多边形,在合成为多个简略多边形后,绘制所有面积不为 0 的图形就能够了。这种计划能够最大限度还原原始数据,并且躲避闪动问题。

小结

解决了数据造成的闪动问题后,就能够在修建的侧面和顶面应用纯色或者纹理贴图进行装璜,搭配天空盒和一些纯色元素去装璜,曾经能够简略模拟出城市的成果。但在以后的修建拔起渲染形式下,只能通过贴图的模式去表白修建细节,如果须要更精密的表白成果,例如玻璃窗体构造、楼顶设施等,须要减少额定的三角形去进行出现。

作者:程序员阿 Tu

链接:https://zhuanlan.zhihu.com/p/…

起源:知乎

著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

退出移动版