将流体设置在容器内部,想让其填充满,却发现粒子碰到网格就会飞溅或者穿透,想到是物体内部的碰撞检测出了问题。
在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 update
void 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 frame
void Update()
{
}
}