Bootstrap

Unity物理模拟——实时交互的流体表面

RoalLun原创 转载请声明

效果:

思路:

首先,mesh是由顶点和三角面组成,所以改变顶点位置就可以改变mesh

通过 GetComponent<MeshFilter>().sharedMesh.vertices可以获得一个Vecter3类型的集合,这就是mesh上的所有顶点

遍历mesh的顶点,在每个mesh顶点位置生成一个球形碰撞体,

如下图就有121个碰撞体,用顶点上的碰撞体模拟球体与流体表面的碰撞。

顶点上的碰撞体被碰撞时,通知mesh改变顶点位置,

    void Update()
    {

        if (transform.position != lastPosition)   //碰撞体位置改变
        {

            if (onMove != null) onMove(pointid, transform.localPosition);  //回调函数,通知mesh改变定点位置

            lastPosition = transform.position;

        }

    }

除此之外,模拟流体波动的效果,顶点碰撞体加上刚体组件,并在FixUpdate()函数里面给刚体添加一个力,

受到的力=(碰撞体初始坐标-碰撞体当前坐标)*力量大小,这个力类似弹簧的受力情况(弹簧被拉扯的越长,恢复原本长度的趋势越大)。通过这个力就可以模拟出流体波动的状体。

    Vector3 awakeVec;      //初始位置
    Rigidbody rig;
    public float inertia;  //顶点碰撞体受到力的大小


    private void Start()
    {
        awakeVec = transform.position;
        rig = GetComponent<Rigidbody>();
    }


    private void FixedUpdate()
    {
        rig.AddForce((awakeVec - transform.position) * inertia);
    }

如何调试流体:

1.顶点碰撞体的受力情况,受到越大得力,流体流动性越强。

2.顶点碰撞体的刚体组件的 Drag(阻力) 属性,这个属性时必要的,否则流体会一直动,永远不停,Drag属性越小,流体流动性越大

3.顶点碰撞体刚体组件的 Mass(质量) 属性,影响流体粒子抖动的持久性

参考:

如何通过改变顶点而修改mesh的思路我参考了:https://blog.csdn.net/zgjllf1011/article/details/79305756 ,我只是在这个基础上给顶点添加了物理特性。

想了解其他炫酷的mesh编程,请移步至 神码编程 大神的网格编辑系列

;