700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Unity3D中实现物体内部的碰撞检测(流体在容器内飞溅)

Unity3D中实现物体内部的碰撞检测(流体在容器内飞溅)

时间:2019-11-26 00:58:53

相关推荐

Unity3D中实现物体内部的碰撞检测(流体在容器内飞溅)

Unity3D中实现物体内部的碰撞检测-流体在容器内飞溅

方法一方法二

将流体设置在容器内部,想让其填充满,却发现粒子碰到网格就会飞溅或者穿透,想到是物体内部的碰撞检测出了问题。

在Unity3D中,我们有时候需要在一个物体内部做碰撞检测,但是我们会发现当把另外一个gameObject放入到该物体的内部(此时,已经拥有碰撞检测条件),当运行游戏时,该gameObject会移出该物体的内部。这不是我们想要的结果,我们需要让它在该物体内部自由移动,当它碰到该物体时,会阻止它出去。

方法一

将该物体在3Dmax中反转法线,具体操作,选择该物体,点击右侧面板的“修改”,打开该属性的下方有“修改器列表”,点击“编辑法线”,鼠标选择好“编辑法线”,再打开“修改器列表”,会发现里面有个“法线”选项,点击打开,选择下方的“反转法线”,然后将该模型导出,在导入到Unity3D中。

在导入到Unity3D以后,我还遇到一些问题,再次跟大家分享一下,首先,必须将导入物体的碰撞器选择为“Mesh Collider“,将内部的gameObject加上刚体和碰撞器,此时才能实现内部的碰撞检测。如果还是有穿透现象,可以查看一下是不是你的gameObject的scale太小,而物体的scale太大,导致检测不到碰撞。

方法二

通过脚本来改变该物体的三角面片和其法线的方向,但是依然会有穿透的现象

在Unity3D中修改三角形面片的渲染顺序,然后将渲染后的mesh赋值给Mesh Collider中的sharemesh,相关代码如下:

using System.Linq;using System.Collections;using System.Collections.Generic;using UnityEngine;// [ExecuteInEditMode]public class Test : MonoBehaviour{// Start is called before the first frame updatevoid Start(){int[] triangles = GetComponent<MeshFilter>().mesh.triangles;for (int i = 0; i < triangles.Length; i += 3){int t = triangles[i];triangles[i] = triangles[i + 2];triangles[i + 2] = t;}GetComponent<MeshFilter>().sharedMesh.triangles = triangles;MeshCollider cc=gameObject.GetComponent<MeshCollider>();cc.sharedMesh=GetComponent<MeshFilter>().mesh;}// Update is called once per framevoid Update(){}}

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