Example #1
0
        //Add all forces that act on the squares below the water
        void AddUnderWaterForces()
        {
            //Get all triangles
            List <TriangleData> underWaterTriangleData = modifyBoatMesh.underWaterTriangleData;

            for (int i = 0; i < underWaterTriangleData.Count; i++)
            {
                //This triangle
                TriangleData triangleData = underWaterTriangleData[i];

                //Calculate the buoyancy force
                Vector3 buoyancyForce = BuoyancyForce(rhoWater, triangleData);

                //Add the force to the boat
                boatRB.AddForceAtPosition(buoyancyForce, triangleData.center);


                //Debug

                //Normal
                // Debug.DrawRay(triangleData.center, triangleData.normal * 3f, Color.white);

                //Buoyancy
                //  Debug.DrawRay(triangleData.center, buoyancyForce.normalized * -3f, Color.blue);
            }
        }
Example #2
0
        //Add all forces that act on the squares below the water
        void AddUnderWaterForces()
        {
            //Get all triangles
            List <TriangleData> underWaterTriangleData = modifyBoatMesh.underWaterTriangleData;


            // for visualizing
            List <ForceOriginPair> forceOriginPairs = new List <ForceOriginPair>(underWaterTriangleData.Count);

            for (int i = 0; i < underWaterTriangleData.Count; i++)
            {
                //This triangle
                TriangleData triangleData = underWaterTriangleData[i];

                //Calculate the buoyancy force
                Vector3 buoyancyForce = BuoyancyForce(rhoWater, triangleData);

                //Add the force to the boat
                boatRB.AddForceAtPosition(buoyancyForce, triangleData.center);

                forceOriginPairs.Add(new ForceOriginPair(buoyancyForce, triangleData.center));

                //Debug

                //Normal
                // Debug.DrawRay(triangleData.center, triangleData.normal * 3f, Color.white);

                //Buoyancy
                // Debug.DrawRay(triangleData.center, buoyancyForce.normalized * -3f, Color.blue);
            }

            gameObject.SendMessage("VisualizeForce", forceOriginPairs, SendMessageOptions.DontRequireReceiver);
        }
Example #3
0
        private Vector3 CalcBuoyancyForce(float rho, TriangleData triangleData)
        {
            Vector3 buoyancyForce = rho * Physics.gravity.y * triangleData.distanceToSurface * triangleData.area * triangleData.normal; //new Vector3(0f, -0.5f, 0f); 避免沉船,方便调试

            buoyancyForce.x = 0f;
            buoyancyForce.z = 0f;

            return(buoyancyForce);
        }
Example #4
0
        void AddUnderWaterForces()
        {
            List <TriangleData> underWaterTriangleData = modifyBoatMesh.underWaterTriangleData;

            for (int i = 0; i < underWaterTriangleData.Count; i++)
            {
                TriangleData triangleData = underWaterTriangleData[i];

                Vector3 buoyancyForce = CalcBuoyancyForce(rhoWater, triangleData);

                boatRB.AddForceAtPosition(buoyancyForce, triangleData.center);
            }
        }
Example #5
0
        //The buoyancy force so the boat can float
        private Vector3 BuoyancyForce(float rho, TriangleData triangleData)
        {
            //Buoyancy is a hydrostatic force - it's there even if the water isn't flowing or if the boat stays still

            // F_buoyancy = rho * g * V
            // rho - density of the mediaum you are in
            // g - gravity
            // V - volume of fluid directly above the curved surface

            // V = z * S * n
            // z - distance to surface
            // S - surface area
            // n - normal to the surface
            Vector3 buoyancyForce = rho * Physics.gravity.y * triangleData.distanceToSurface * triangleData.area * triangleData.normal;

            //The vertical component of the hydrostatic forces don't cancel out but the horizontal do
            buoyancyForce.x = 0f;
            buoyancyForce.z = 0f;

            return(buoyancyForce);
        }