//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); } }
//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); }
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); }
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); } }
//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); }