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 ,我只是在这个基础上给顶点添加了物理特性。