示例#1
0
    void FixedUpdateBuoyancy(ICollProvider collProvider)
    {
        float archimedesForceMagnitude = WATER_DENSITY * Mathf.Abs(Physics.gravity.y);

        for (int i = 0; i < _forcePoints.Length; i++)
        {
            FloaterForcePoints point = _forcePoints[i];
            var transformedPoint     = transform.TransformPoint(point._offsetPosition + new Vector3(0, _centerOfMass.y, 0));

            Vector3 undispPos;
            if (!collProvider.ComputeUndisplacedPosition(ref transformedPoint, _samplingData, out undispPos))
            {
                // If we couldn't get wave shape, assume flat water at sea level
                undispPos   = transformedPoint;
                undispPos.y = OceanRenderer.Instance.SeaLevel;
            }

            Vector3 displaced;
            collProvider.SampleDisplacement(ref undispPos, _samplingData, out displaced);

            var dispPos    = undispPos + displaced;
            var heightDiff = dispPos.y - transformedPoint.y;
            if (heightDiff > 0)
            {
                RB.AddForceAtPosition(archimedesForceMagnitude * heightDiff * Vector3.up * point._weight * _forceMultiplier / _totalWeight, transformedPoint);
            }
        }
    }
示例#2
0
    void FixedUpdateBuoyancy()
    {
        float archimedesForceMagnitude = WATER_DENSITY * Mathf.Abs(Physics.gravity.y);
        var   collProvider             = OceanRenderer.Instance.CollisionProvider;

        for (int i = 0; i < ForcePoints.Length; i++)
        {
            FloaterForcePoints point = ForcePoints[i];
            var transformedPoint     = transform.TransformPoint(point._offsetPosition + new Vector3(0, _centerOfMass.y, 0));

            Vector3 undispPos;
            if (!collProvider.ComputeUndisplacedPosition(ref transformedPoint, out undispPos, _minSpatialLength))
            {
                // If we couldn't get wave shape, assume flat water at sea level
                undispPos   = transformedPoint;
                undispPos.y = OceanRenderer.Instance.SeaLevel;
            }

            var waterSurfaceVel = Vector3.zero;

            bool dispValid, velValid;
            collProvider.SampleDisplacementVel(ref undispPos, out point._displaced, out dispValid, out waterSurfaceVel, out velValid, _minSpatialLength);

            var dispPos = undispPos + point._displaced;

            float height;
            collProvider.SampleHeight(ref transformedPoint, out height, _minSpatialLength);

            float distance = dispPos.y - transformedPoint.y;

            if (height - transformedPoint.y > 0)
            {
                _rb.AddForceAtPosition(archimedesForceMagnitude * distance * Vector3.up * point._factor * _forceMultiplier, transformedPoint);
            }
        }
    }