水中浮力插件buoyancy_NaughtyWaterBuoyancy浮力插件解析

本文介绍了开源浮力插件NaughtyWaterBuoyancy的工作原理,核心在于根据物体浸入水下的深度计算浮力。 FloatingObject.cs和WaterVolume.cs是关键脚本,通过计算每个体元的浮力并应用到物体上,实现物体在水中的浮力效果。插件还需改造以适应特定场景,如河流的浮力系统和水流推动效果。
摘要由CSDN通过智能技术生成

1be19f53042cc11202e4368da8bb8f7d.png

为了给河流加浮力系统,于是我搞了个浮力插件来研究了下。插件是开源的,地址:

dbrizov/NaughtyWaterBuoyancy​github.com
1d6cef23f736e56794756d841ae3dc29.png

两个重要的脚本是WaterVolume.csFloatingObject.cs。FloatingObject.cs挂到漂浮物上,WaterVolume.cs挂到水物体上。水物体的Tag设置为Water Volume。就可以用了,很简单。具体使用方法参看ReadMe页面。

05b0f49ca46996c5514ffd20de819ef0.gif
浮力系统效果

核心原理分析

这个浮力系统的本质就是根据物体浸入水下的深度来计算一个给它向上的浮力,当完全浸入水中时浮力最大。完全离开水面时浮力为0,物体呈现自由落体。当调整物体的质量为适度的值时,物体的质量和浮力会保持平衡,物体就会漂浮在水面上。

核心代码主要在在FloatingObject.cs中的FixUpdate中。如下,对应进行了详细注释。其中体元的意思是把一个物体的整体浮力切分成若干离散力的组合。就如下面的红色方块。

6fa75e622e4c22ca998eb78d86f034ac.gif
图中红色方块调试画面就表示体元

下面简要分析它的浮力的计算流程:

1.进行参数的准备,计算每个体元的forceAtSingleVoxel,bounds ,voxelHeight ,worldPoint 。

//将总共的浮力分到每个体元
Vector3 forceAtSingleVoxel = this.CalculateMaxBuoyancyForce () / this.voxels.Length;
Bounds bounds = this.collider.bounds;
//每个体元的高度
float voxelHeight = bounds.size.y * this.normalizedVoxelSize;
//体元的世界坐标位置
Vector3 worldPoint = this.transform.TransformPoint (this.voxels[i]);
<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值