Beispiel #1
0
    public override void UpdateBehavior(FluidSimulation sim, FluidSimulation.PhysicObject physicObject)
    {
        // PARAMS FOR OBJECTS
        // How much they are in the water
        // How fast they rotate
        float   y;
        Vector3 normal = sim.GetYNormal(physicObject.gao.transform.position.x, physicObject.gao.transform.position.z, out y);

        var rigidBody = physicObject.gao.GetComponent <Rigidbody>();

        if (rigidBody)
        {
            /*
             * rigidBody.isKinematic = true;
             * physicObjects[i].transform.position = new Vector3(physicObjects[i].transform.position.x, y, physicObjects[i].transform.position.z);
             * physicObjects[i].transform.rotation = Quaternion.FromToRotation(Vector3.up, normal);
             */


            if (y > 0.0f)
            {
                float mv = physicObject.volume / rigidBody.mass;

                float height      = 0.0f;
                var   objCollider = physicObject.gao.GetComponent <Collider>();
                if (objCollider)
                {
                    height = objCollider.bounds.size.y;
                }

                //Debug.Log("Mass=" + rigidBody.mass + ", volume=" + physicObjects[i].volume + ", mv=" + mv + ", height = " + height);

                float PercentageInFluid = 1.0f - (physicObject.gao.transform.position.y - y + (height / 2.0f)) / height;
                float Ratio             = 1.0f - physicObject.gao.transform.position.y / y;

                //Debug.Log("pos = " + physicObjects[i].gao.transform.position.y + ", y=" + y + ", Ratio = " + Ratio + ", Height=" + PercentageInFluid);

                // compute mass in fluid
                float massInsideFluid  = PercentageInFluid * physicObject.volume; //1.0 = liquid vm
                float massOutsideFluid = (1.0f - PercentageInFluid) * rigidBody.mass;
                float archimedRatio    = massInsideFluid / (massInsideFluid + massOutsideFluid);

                // Update submerged volume
                float newSubmergedVolume   = PercentageInFluid * physicObject.volume;
                float deltaSubmergedVolume = newSubmergedVolume - physicObject.submergedVolume;
                physicObject.submergedVolume = newSubmergedVolume;

                //Debug.Log("Mass in fluid=" + massInsideFluid + ", Mass outside fluid= " + massOutsideFluid + ", ArchiRatio=" + archimedRatio + ", Volume=" + physicObjects[i].volume);

                // submerge volume effect
                int index = sim.GetArrayIndexFromPos(physicObject.gao.transform.position);

                /*
                 * if (index >= 0)
                 *  speedY[index] += deltaSubmergedVolume * 2.0f;
                 */

                /* physic effect temporarily removed
                 * if(index >= 0)
                 *  simulation.SetSpeed(index, simulation.GetSpeed(index) + deltaSubmergedVolume * 2.0f);
                 *
                 * rigidBody.AddForce((0.2f * archimedRatio * mv * normal * Physics.gravity.magnitude), ForceMode.Force);
                 * if (rigidBody.velocity.y < 0.0f)
                 *  rigidBody.velocity = rigidBody.velocity * 0.98f;
                 */

                /*
                 * if (Ratio > 0.0f)
                 * {
                 *  rigidBody.AddForce(mv * normal * Physics.gravity.magnitude * (0.25f + Ratio * 0.25f), ForceMode.Force);
                 *  if (rigidBody.velocity.y < 0.0f)
                 *      rigidBody.velocity = rigidBody.velocity * 0.98f;
                 * }
                 */
            }

            /*
             * objectsSpeed[i] = (objectsSpeed[i] + normal) * 0.95f;
             * Vector3 Dest = floatingObjects[i].transform.position + objectsSpeed[i] * Time.deltaTime;
             * Dest.y = y;
             * floatingObjects[i].transform.position = Vector3.Lerp(floatingObjects[i].transform.position, Dest, 0.3f);
             * floatingObjects[i].transform.rotation = Quaternion.RotateTowards(floatingObjects[i].transform.rotation, Quaternion.FromToRotation(Vector3.up, normal), 0.3f);
             */
        }
        else
        {
            physicObject.gao.transform.position = new Vector3(physicObject.gao.transform.position.x, y, physicObject.gao.transform.position.z);
            physicObject.gao.transform.rotation = Quaternion.FromToRotation(Vector3.up, normal);
        }
    }