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 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()
    {
 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值