示例#1
0
    private void SimulateBuoyancy(FluidVolume fluidVolume)
    {
        Bounds bounds = buoyancyCollider.bounds;

        bounds.Expand(boundsExtentBias);

        float tangentOffset   = bounds.size.x / (float)samples;
        float bitangentOffset = bounds.size.z / (float)samples;

        float impulse = -Physics.gravity.y * Time.fixedDeltaTime;

        if (useWeighting)
        {
            impulse *= (weightFactor + weightFactorBias) * GetComponent <Rigidbody>().mass *inverseVolume;
        }
        else
        {
            impulse *= fluidVolume.density;
        }

        Vector3 min = new Vector3(bounds.min.x, fluidVolume.GetComponent <Collider>().bounds.min.y, bounds.min.z);

        for (int x = 0; x < samples; x++)
        {
            for (int z = 0; z < samples; z++)
            {
                Vector3 offset = new Vector3(tangentOffset * ((float)x + 0.5f), 0.0f, bitangentOffset * ((float)z + 0.5f));
                Vector3 start  = min + offset;

                ApplySampleImpulse(start, tangentOffset, bitangentOffset, fluidVolume.RelativeHeightAtPoint(start), impulse);
            }
        }
    }