The buoyancy is calculated based on the bounding box of the object ("Submergence" function).
protected virtual void OnTriggerStay(Collider other)
{
other.SendMessage("OnWaterStay", C, SendMessageOptions.DontRequireReceiver);
R = other.GetComponent<Rigidbody>();
if(R!=null)
{
//Flow
R.velocity += globalFlow * Time.fixedDeltaTime / R.mass;
//Drag
V = R.velocity.magnitude;
R.velocity = R.velocity.normalized * Mathf.Clamp(R.velocity.magnitude - ((density * V * V) / 2 * Time.fixedDeltaTime * R.drag) / R.mass, 0, float.PositiveInfinity);
//Angular Drag
V = R.angularVelocity.magnitude;
R.angularVelocity = R.angularVelocity.normalized * Mathf.Clamp(R.angularVelocity.magnitude - ((density * V * V) / 2 * Time.fixedDeltaTime * R.angularDrag) / R.mass, 0, float.PositiveInfinity);
//Buoyancy
R.velocity -= (Physics.gravity * density * Submergence(C.bounds, other.bounds) * Time.fixedDeltaTime) / R.mass;
}
}
public static float Submergence1D(float C,float R,float c,float r)
{
if(R<r)
{
var tmp = R;
R = r;
r = tmp;
tmp = C;
C = c;
c = tmp;
}
return Mathf.Clamp(2 * R - (Mathf.Abs((C + R) - (c + r)) + Mathf.Abs((C - R) - (c - r))), 0, 2 * r);
}
public static float Submergence(Bounds W,Bounds O)
{
return Submergence1D(W.center.x, W.extents.x, O.center.x, O.extents.x) * Submergence1D(W.center.y, W.extents.y, O.center.y, O.extents.y) * Submergence1D(W.center.z, W.extents.z, O.center.z, O.extents.z);
}
0 comments