优化Unity3D插件Ezy-Slice部分缺陷

2023-11-21 16:20

本文主要是介绍优化Unity3D插件Ezy-Slice部分缺陷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Unity3D中,如果制作者想开发一款类似《水果忍者》类型的游戏,需要利用到Mesh的切割技术,那我认为Ezy-Slice这款插件是必不可少的。本文着重讲解的是如何优化,代码的细节部分我不会过多讲解。有需要的可以自行去官网下载理解。

作者也是第一次写这类技术文章,作为刚入职工作的比较满意的成果,如果有地方写的不好请大家谅解~

插件网址GitHub - DavidArayan/ezy-slice: An open source mesh slicer framework for Unity3D Game Engine. Written in C#.

首先该插件使用的主要方法入口是SliceObject,需要提供一个被切割的物体GameObject,一个起始的坐标和法线方向,法线方向就是切割完法线朝着的那一侧为正侧,另一侧为反侧。

public SlicedHull SliceObject(GameObject obj, Vector3 StartPosition, Vector3 Normal, Material crossSectionMaterial = null){// slice the provided object using the transforms of this objectreturn obj.Slice(StartPosition, Normal, crossSectionMaterial);}

在Slicer类中有这么一个方法

public static SlicedHull Slice(Mesh sharedMesh, Plane pl, TextureRegion region, int crossIndex)

此处将所有的Mesh分为一个个三角面,让每个三角面和入口传入的这个‘片’进行判断是否在正面、侧面、还是相交。相对的,如果两个面有相交,则需要把交点求出。

此处就代码可以进行优化,在制作过程中,原作者并没有把刚刚好共线的线添加到相交的类型里面,导致如果我们切割的时候恰好是沿着这个模型某一条线段进行切割,就会导致缺少这个刚刚好平行的线段,也就是少点了,就无法补足侧面,所以我做了一下的更新。这样就可以把刚刚好是在平面上或者是相交的线段加入到所有相交的点数组中。

                    if (side == SideOfPlane.UP || side == SideOfPlane.ON){mesh.upperHull.Add(newTri);if (sa == SideOfPlane.ON && sa == sb)//如果刚刚好在平面上,直接将线段当作交点加进去{result.AddIntersectionPoint(verts[i0]);result.AddIntersectionPoint(verts[i1]);}else if (sa == SideOfPlane.ON && sa == sc){result.AddIntersectionPoint(verts[i0]);result.AddIntersectionPoint(verts[i2]);}else if (sb == SideOfPlane.ON && sb == sc){result.AddIntersectionPoint(verts[i1]);result.AddIntersectionPoint(verts[i2]);}int interHullCount = result.intersectionPointCount;for (int i = 0; i < interHullCount; i++){var n = result.intersectionPoints[i];n.i = index + startIndex;crossHull.Add(n);}}

好了,此处我们将所有相交的点已经加入,但是在Triangulator这个类中。原作者使用的是凸包算法,也就是在空间的游离点中,寻找所有最外围的点,把他们围成新的Mesh。但是如果我们的模型是具有凹字型结构,就无法适用这套算法,所以我们采用的是有向连通图的算法,通过线段和线段,最近点和点进行合并的算法。达成连接一个空间中游离点的最大环

while (testmapped.Count > 1){Mapped2D mpnext = testmapped.Find(m => m.index == currentmp.index);newmapped.Add(mpnext);testmapped.Remove(mpnext);float minDistance = float.MaxValue;Mapped2D mpnear = testmapped[0];testmapped.ForEach(m =>{float distance = Vector2.Distance(m.mappedValue, mpnext.mappedValue);if (distance < minDistance){minDistance = distance;mpnear = m;}});testmapped.Remove(mpnear);currentmp = mpnear;}

这些点就自然而然的连起来了,再用上平面三角面的构造函数,构造出来侧面的Mesh,这样就大功告成了!

这是结果

 以后我还会分享一些在工作中遇到的困难和解决思路~希望各位大佬海涵

 

这篇关于优化Unity3D插件Ezy-Slice部分缺陷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/403517

相关文章

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

golang中slice扩容的具体实现

《golang中slice扩容的具体实现》Go语言中的切片扩容机制是Go运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存,本文主要介绍了golang中slice扩容的具体实现,感兴趣... 目录1. 切片扩容的触发append 函数的实现2. runtime.growslice 函数gro

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Idea插件MybatisX失效的问题解决

《Idea插件MybatisX失效的问题解决》:本文主要介绍Idea插件MybatisX失效的问题解决,详细的介绍了4种问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、重启idea或者卸载重装MyBATis插件(无需多言)二、检查.XML文件与.Java(该文件后缀Idea可能会隐藏