网易首页 > 网易号 > 正文 申请入驻

【博物纳新】网格切割算法

0
分享至

【博物纳新】专栏回归啦~ 这个专栏是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

更多精彩内容请关注:lab.uwa4d.com

一、概览

该示例展示了一种简单的3D网格切割算法。在运行状态下,通过在屏幕上拖拽划线,被线条划过的物体就会被线条分成左右两部分。

如果某些游戏需要包含切割物体之类的玩法,或者项目需要对物体切割的辅助工具,那么该插件可以作为良好的借鉴材料。

开源地址:

https://lab.uwa4d.com/lab/5b3e3197d6d8c0171a9469b5

二、原理概述

该工具的原理可以分为划线、切割、补齐三部分。

1、划线部分:通过捕捉鼠标在屏幕上的拖拽轨迹,从而获取到切割平面的基本数据信息(如法向量等);

2、切割部分:通过添加点和三角面等操作,把原本的Mesh切割成若干个独立的Mesh,再附着给各个被切开的Objects;

3、补齐部分:把每个被切割的物体的切面补上新的面。

三、具体实现

3.1 划线

这一部作为一个直观的操作,逻辑并不多,主要是要清楚这一部在准备什么数据。下图就是该步骤的主要逻辑:

该方法在MouseSlice.cs脚本中,从中我们可以知道切割物体需要的就是三个三维向量start、end和depth。这三个变量的收集来源ScreenLineRenderer.cs的Update():

从上图可知,start和end对应于上图的startRay和endRay,分别是从摄像机位置出发,指向划线的起点和终点的两条射线,而depth是endRay的归一化向量。

划线切割物体的本质是划了一个平面来切割3D物体,之所以看起来是一条线是因为摄像机恰好在该平面上,该平面如下图所示。这样看来图1中63行的输入(某个点和法向量)就容易理解了,因为一个点和平面的一条法向量可以确定一个平面。

3.2 切割

切割物体时,我们可以注意到每次切割物体其实都是在实例化一个新的物体:

对应代码来自MouseSlice.cs中的SliceObject方法(如下图),从该代码可知,原Mesh会被分开成biggerMesh和smallerMesh两个网格,然后分别更替原物体和新增物体的Mesh(130-131行)。

切割过程是一个添加点的过程。把过程聚焦到每个三角面,如果某个三角面会被切割,那该三角形必定会新增两个点。对应的代码如下:

图中遍历每个三角面,如果会与切割平面相交,那么新增的两个点会加入addedPairs,而关于相交计算的部分在TrianglePlaneIntersect()中。

下图是TrianglePlaneIntersect()中的片段:

这一段代码如果搭配着下图会比较容易理解:

longlyPoint指的就是被切平面(红色实线)单独分到一侧的点,而127和128行得到的newPointPrev和newPointNext就是上图中两个红色的点newPrev和newNext。131-135行是在添加由新的点组成的三角形,以上图为例,从上到下分别添加了(longly,newPrev,newNext)、(prev,newPrev,next)和(next,newPrev,newNext)三个三角形,并且以是否与切割平面法线同侧为标准分别加入了不同的Mesh中。

这一步基本已经完成了切割,毕竟“添加点”和“添加三角形”就是切割网格的本质。但是如果只做到这一步,只会得到如下的效果图,所以对于切面的各个三角面仍然需要补齐。

3.3 补齐

该部分是在补齐由切割平面新增的两个截面,对应的代码段就是MeshCutter.cs中的FillBoundaryFace():

该函数的详细代码如下:

基本思想就是在切割面所新形成的点集中,按序添加三角形。从158行可以看出,这里是双向遍历的。单向和双向所构成的三角面如下示例:

图中黑线是待补齐的平面,红线则是通过循环补的三角面。那么为何要用稍显复杂的双向循环来补齐呢?因为单个顶点的复用会使得大量三角形都比较“狭长”,那么被共用多次的顶点附近的像素在光栅化阶段参与三角形遍历的次数就会增多,也就是Overshading现象会比较严重,这会增大GPU的压力。这就是为何大多数建模软件中,Mesh网格都尽量避免多个三角形共用单个顶点的原因。

相关知识可参考:

https://zhuanlan.zhihu.com/p/57661927

而该步骤之后,被切割平面分开的两个物体块就补齐了切割面:

四、性能分析

通过UWA GOT Online在中等配置机型OPPO A72(6G RAM)上做了测试,测试场景为同时切20个圆柱体,测试时间60秒,从第20秒开始切割。

下图是CPU耗时曲线图:

从图中可以看到,从开始切割(约1200帧处)之后,耗时主要集中在Camera.Render和ScreenLineRenderer.Update上。首先我们注意到ScreenLineRenderer.Update的耗时原因是划线操作引起的即时性的峰值耗时,该项可以通过游戏玩法来优化(比如我们可以用发射子弹等其他方式来替代划线切割),这里我们主要研究Camera.Render的耗时。上图中,随着切割出的物体块越来越多,Camera.Render的耗时稳步上升,下图是在物体块很多时的某帧的堆栈耗时:

通过对比测试开始和结尾附近的帧的堆栈耗时,可以发现耗时增加最快的是上图红框中的Render.Mesh。该项的耗时通常由物体中未合批的物体数量决定,从调用次数来看,该项的耗时就是由于分割了过多物体块且未进行合批优化导致的结果。

为了对比说明,下图展示了可以进行动态合批的相同测试案例的堆栈耗时:

从该图可以看出BatchRenderer.Flush的总体占比比未合批时的占比低了大概12%,Render.Mesh调用次数也减少了许多(至于为何主要比较“总体占比”,是因为两次实验很难切出相同数量的物体块)。但其实动态合批的数量不算太多,因为物体块的顶点数量很容易超过300:

所以动态合批提升性能的幅度通常是不确定的,拿该项目为例,如果切割的是一些简单的、顶点数量比较小的物体,那么动态合批的性能提升应该会更大。

除此之外,GPU的耗时增幅也比较可观:

从图中可以看出,除了由ScreenLineRenderer.Update引起的峰值耗时外,均值上升主要是由顶点和三角面数的迅速增加造成的。

综上所述,如果需要使用该插件,那么最好满足:1、物体顶点数不多,且不需要分割出太多物体块;2、支持动态合批。

测试报告地址:

https://www.uwa4d.com/u/got/perfanalysis.html/overview?project=28189&type=4

作者发布项目时的介绍使用的是日文编写,为了方便大家阅读,UWA开源库已将其翻译成中文版本,欢迎大家共同学习。

快用UWA Lab合辑Mark好项目!

今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......

请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。

近期精彩回顾

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
FIFA前四史无前例包揽四强!阿根廷携梅西2026大力神杯真要卫冕?

FIFA前四史无前例包揽四强!阿根廷携梅西2026大力神杯真要卫冕?

中山印象体育摄影师
2026-07-12 13:46:05
帮LV胜诉的中国律所被扒!坑害国企数十年,央媒怒批,吃相太难看

帮LV胜诉的中国律所被扒!坑害国企数十年,央媒怒批,吃相太难看

米果说识
2026-07-11 14:18:32
惊魂九分钟!欧洲战斗机挂弹升空, 拦截中国客机

惊魂九分钟!欧洲战斗机挂弹升空, 拦截中国客机

鲁晓芙看欧洲
2026-07-10 16:36:10
告诉你一个很玄学的真相:情侣或夫妻中,那个最大方、最宽厚、最不斤斤计较的人,往往分手,离婚后能过得更好,新的对象一般也更优秀

告诉你一个很玄学的真相:情侣或夫妻中,那个最大方、最宽厚、最不斤斤计较的人,往往分手,离婚后能过得更好,新的对象一般也更优秀

心理观察局
2026-07-12 06:44:11
6月新冠确诊逼近8万例!中疾控数据公布,这波疫情到底该怎么看

6月新冠确诊逼近8万例!中疾控数据公布,这波疫情到底该怎么看

娱乐圈见解说
2026-07-12 08:46:03
回怼“抢跑”争议不靠嘴,余承东晒“升顶帐篷”真车及专利

回怼“抢跑”争议不靠嘴,余承东晒“升顶帐篷”真车及专利

大厂财经社
2026-07-11 11:04:05
包头“黑老大”王永明去世,网传检察官出狱后自杀,事件扑朔迷离

包头“黑老大”王永明去世,网传检察官出狱后自杀,事件扑朔迷离

追月数星
2026-07-11 22:03:25
日本走投无路,开始了绝望的自救行动!

日本走投无路,开始了绝望的自救行动!

一个坏土豆
2026-07-11 19:23:23
挪威队出局,为两个选择付出代价!他对哈兰德的态度,早有迹象!

挪威队出局,为两个选择付出代价!他对哈兰德的态度,早有迹象!

刘哥谈体育
2026-07-12 12:00:32
见证历史!全国首个禁售燃油车省份确定

见证历史!全国首个禁售燃油车省份确定

吉刻新闻
2026-07-11 09:17:43
随着英格兰2-1淘汰挪威,世界杯4强对阵如下,最新夺冠排行出炉了

随着英格兰2-1淘汰挪威,世界杯4强对阵如下,最新夺冠排行出炉了

小火箭爱体育
2026-07-12 08:26:37
全网笑疯!湖北人硬核备战台风,街头电动车车主把车放倒贴地,还贴上温馨提示“不要扶起”

全网笑疯!湖北人硬核备战台风,街头电动车车主把车放倒贴地,还贴上温馨提示“不要扶起”

火山詩话
2026-07-12 07:37:10
央媒置顶点名长沙副处长霸车位:小事见私德,私德失则公信垮

央媒置顶点名长沙副处长霸车位:小事见私德,私德失则公信垮

十为先生
2026-07-12 08:24:48
62岁大爷每天踮脚尖30分钟,半年后检查,医生惊讶:你干了什么?

62岁大爷每天踮脚尖30分钟,半年后检查,医生惊讶:你干了什么?

芹姐说生活
2026-07-11 23:14:25
梅西眼眶受伤出血,补水暂停时接受治疗

梅西眼眶受伤出血,补水暂停时接受治疗

极目新闻
2026-07-12 11:15:28
热议阿根廷3-1瑞士:恩博洛拙劣表演,阿根廷有比赛气质

热议阿根廷3-1瑞士:恩博洛拙劣表演,阿根廷有比赛气质

懂球帝
2026-07-12 12:09:31
62岁阿姨的忏悔:人老了出轨虽然开心得一时,但是最终结果却很惨

62岁阿姨的忏悔:人老了出轨虽然开心得一时,但是最终结果却很惨

惟来
2026-07-11 13:59:25
司晓迪再爆猛料:鹿晗对不起关晓彤不止感情

司晓迪再爆猛料:鹿晗对不起关晓彤不止感情

谢鵑解说
2026-07-10 15:09:27
卡塔尔首都传出爆炸声

卡塔尔首都传出爆炸声

财联社
2026-07-12 11:21:07
彻底破防后,日防长一语惊人,他想让中国明白:越南早就站日本了

彻底破防后,日防长一语惊人,他想让中国明白:越南早就站日本了

晓囝爱八卦
2026-07-12 12:49:49
2026-07-12 15:47:00
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1596文章数 987关注度
往期回顾 全部

科技要闻

苹果诉OpenAI细节:一句“笑死”刺痛库克

头条要闻

朝鲜宣布对特大腐败分子的判决 金正恩亲自出席会议

头条要闻

朝鲜宣布对特大腐败分子的判决 金正恩亲自出席会议

体育要闻

被3个队友锁死,哈兰德以最憋屈的方式出局

娱乐要闻

迪丽热巴估计都无语了 亲自下场辟

财经要闻

美联储和市场将走向何方?

汽车要闻

纯电/增程双动力 一汽悦意08正式上市售9.99万起

态度原创

时尚
教育
房产
本地
艺术

2026中国时尚产业盛典圆满闭幕

教育要闻

中考数学求面积,整体思维,学会了吗?

房产要闻

重磅学校规划曝光!西海岸教育,正强得可怕!

本地新闻

重庆人有自己的避暑桃花源 | 夏天就去「酉」风的地方!

艺术要闻

250米!大疆深圳湾“金字塔”总部,施工已全面铺开!

无障碍浏览 进入关怀版