void dgCollisionInstance::CalculateBuoyancyAcceleration (const dgMatrix& matrix, const dgVector& origin, const dgVector& gravity, const dgVector& fluidPlane, dgFloat32 fluidDensity, dgFloat32 fluidViscosity, dgVector& unitForce, dgVector& unitTorque) { dgMatrix globalMatrix (m_localMatrix * matrix); unitForce = dgVector (dgFloat32 (0.0f)); unitTorque = dgVector (dgFloat32 (0.0f)); dgVector volumeIntegral (m_childShape->CalculateVolumeIntegral (globalMatrix, fluidPlane, *this)); if (volumeIntegral.m_w > dgFloat32 (0.0f)) { dgVector buoyanceCenter (volumeIntegral - origin); dgVector force (gravity.Scale (-fluidDensity * volumeIntegral.m_w)); dgVector torque (buoyanceCenter.CrossProduct(force)); unitForce += force; unitTorque += torque; } }
void dgCollisionInstance::CalculateBuoyancyAcceleration (const dgMatrix& matrix, const dgVector& origin, const dgVector& gravity, const dgVector& fluidPlane, dgFloat32 fluidDensity, dgFloat32 fluidViscosity, dgVector& accel, dgVector& alpha) { dgMatrix scaledMatrix (m_localMatrix * matrix); switch (m_scaleType) { case m_unit: case m_uniform: case m_nonUniform: { scaledMatrix[0] = scaledMatrix[0].Scale4 (m_scale[0]); scaledMatrix[1] = scaledMatrix[1].Scale4 (m_scale[1]); scaledMatrix[2] = scaledMatrix[2].Scale4 (m_scale[2]); break; } default: dgAssert(0); } accel = dgVector (dgFloat32 (0.0f)); alpha = dgVector (dgFloat32 (0.0f)); dgVector volumeIntegral (m_childShape->CalculateVolumeIntegral (scaledMatrix, fluidPlane)); if (volumeIntegral.m_w > dgFloat32 (0.0f)) { dgVector buoyanceCenter (volumeIntegral - origin); dgVector force (gravity.Scale3 (-fluidDensity * volumeIntegral.m_w)); dgVector torque (buoyanceCenter * force); // dgFloat32 damp = GetMax (GetMin ((m_veloc % m_veloc) * dgFloat32 (100.0f) * fluidLinearViscousity, dgFloat32 (1.0f)), dgFloat32(dgFloat32 (10.0f))); // force -= m_veloc.Scale3 (damp); //damp = (m_omega % m_omega) * dgFloat32 (10.0f) * fluidAngularViscousity; // damp = GetMax (GetMin ((m_omega % m_omega) * dgFloat32 (1000.0f) * fluidAngularViscousity, dgFloat32(0.25f)), dgFloat32(2.0f)); // torque -= m_omega.Scale3 (damp); // dgThreadHiveScopeLock lock (m_world, &m_criticalSectionLock); accel += force; alpha += torque; } }