【虚拟仿真】Unity3D对物体进行拆分实现

您所在的位置:网站首页 运动轨迹仿真ArcGIS 【虚拟仿真】Unity3D对物体进行拆分实现

【虚拟仿真】Unity3D对物体进行拆分实现

2023-06-03 17:02| 来源: 网络整理| 查看: 265

推荐阅读

CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 一、前言

在仿真开发中,会遇到将模型进行移动、放大、旋转、拆分、合并等操作,其他的移动、放大、旋转都有比较多的例子进行参考,今天就分享一下如何将物体进行拆分。

先看下效果图: 在这里插入图片描述

二、实现思路

这个实现的思路有很多的,比如: 1、先将模型拆分好,然后记录拆好的物体的坐标,然后拆分的时候让物体移动到拆好的物体的坐标

2、设置一个中心点,然后其他物体向这个中心点的反方向附加一个力,这样就有一种弹开的效果

3、添加物理效果,比如给所有物体增加碰撞盒,然后之间碰撞离散

4、以物体的法线向四周添加力,让物体离散

5、设置一个中心点,其他对象以这个中心点为目标点,计算跟这个中心点的距离,然后将这个距离乘两倍,就是这个对象新的位置

三、实现

咱们就按照第五个思路进行。就是先设置一个中心点,其他对象以这个中心点为目标点,计算跟这个中心点的距离,然后将这个距离乘2,就是这个对象新的位置。

1、首先设置一个中心点,这个中心点最好是所有物体的中心位置,这样其他对象才能均匀的拆分

using System.Collections.Generic; using UnityEngine; public class SplitTest : MonoBehaviour { public Transform m_ParObj;//中心点 }

2、获取所有的子对象

using System.Collections.Generic; using UnityEngine; public class SplitTest : MonoBehaviour { public Transform m_ParObj;//中心点 private void Start() { List m_Child = GetChild(m_ParObj);//获取所有子对象 } public List GetChild(Transform obj) { List tempArrayobj = new List(); foreach (Transform child in obj) { tempArrayobj.Add(child.gameObject); } return tempArrayobj; } }

3、根据子对象和中心点计算出来距离,然后让这个距离乘2:

public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj) { Vector3 tempV3; tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2; tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2; tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2; return tempV3; }

4、将所有的子对象一个个的传入这个函数中,求得目标位置,然后设置子对象移动到目标位置:

using System.Collections.Generic; using UnityEngine; public class SplitTest : MonoBehaviour { public Transform m_ParObj;//中心点 private void Start() { List m_Child = GetChild(m_ParObj);//获取所有子对象 for (int i = 0; i List tempArrayobj = new List(); foreach (Transform child in obj) { tempArrayobj.Add(child.gameObject); } return tempArrayobj; } public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj) { Vector3 tempV3; tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2; tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2; tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2; return tempV3; } }

5、将父对象赋值给ParObj卡槽: 在这里插入图片描述

6、效果展示: 初始: 在这里插入图片描述 运行起来: 在这里插入图片描述 7、如果想要加入动画分解的效果,可以使用DoTween:

DoTween插件从这里下载:下载链接 下载以后导入到场景中即可。

using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class SplitTest : MonoBehaviour { public Transform m_ParObj;//中心点 private void Start() { List m_Child = GetChild(m_ParObj);//获取所有子对象 for (int i = 0; i List tempArrayobj = new List(); foreach (Transform child in obj) { tempArrayobj.Add(child.gameObject); } return tempArrayobj; } public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj) { Vector3 tempV3; tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2; tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2; tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2; return tempV3; } }

在这里插入图片描述

四、后记

根据小伙伴们的意见,修改了代码,加入了拆分和合并的功能。

操控方式:键盘W拆分,键盘S合并。

将源工程也放入到CSDN:

源码下载: https://download.csdn.net/download/q764424567/16687406

因为教程中涉及的模型属于保密模型,所以源工程中的模型改成了Cube替代,但是效果都是一样的,如下图所示:

在这里插入图片描述

修改后代码:

using DG.Tweening; using System.Collections.Generic; using UnityEngine; public class SplitTest : MonoBehaviour { public Transform m_ParObj;//中心点 private List m_Child;//所有子对象 private List m_InitPoint=new List();//初始位置 private void Start() { m_Child = m_ParObj.GetChild();//获取所有子对象 for (int i = 0; i if (Input.GetKeyDown(KeyCode.W)) { //拆分 SplitObject(); } if (Input.GetKeyDown(KeyCode.S)) { //合并 MergeObject(); } } private void SplitObject() { for (int i = 0; i for (int i = 0; i Vector3 tempV3; tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2; tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2; tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2; return tempV3; } }

最后说一点,将本教程中的拓展函数部分去掉了,因为我觉得对于大部分初学者来说拓展函数并没有什么用。

但是,源工程中还是保留了这部分代码,需要的可以下载源工程。

你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3