diff --git a/examples/testbed/tests/pinned_softbody.h b/examples/testbed/tests/pinned_softbody.h index 131d2e4..1b4eefe 100644 --- a/examples/testbed/tests/pinned_softbody.h +++ b/examples/testbed/tests/pinned_softbody.h @@ -32,7 +32,7 @@ public: b3SoftBodyDef def; def.mesh = &m_mesh; def.density = 0.2f; - def.E = 100.0f; + def.E = 1000.0f; def.nu = 0.33f; def.c_yield = 0.1f; def.c_creep = 0.5f; @@ -40,6 +40,12 @@ public: m_body = new b3SoftBody(def); + for (u32 i = 0; i < m_mesh.vertexCount; ++i) + { + b3SoftBodyNode* n = m_body->GetVertexNode(i); + n->SetDamping(0.2f); + } + u32 pinIndex = ~0; float32 pinDot = -B3_MAX_FLOAT; for (u32 i = 0; i < m_mesh.vertexCount; ++i) diff --git a/include/bounce/softbody/softbody.h b/include/bounce/softbody/softbody.h index 2457d3a..9316e95 100644 --- a/include/bounce/softbody/softbody.h +++ b/include/bounce/softbody/softbody.h @@ -26,7 +26,8 @@ class b3World; struct b3SoftBodyMesh; -class b3SoftBodyNode; +struct b3SoftBodyNode; +struct b3SoftBodyElement; struct b3RayCastInput; struct b3RayCastOutput; diff --git a/include/bounce/softbody/softbody_contact_solver.h b/include/bounce/softbody/softbody_contact_solver.h index ff8350b..dea16cf 100644 --- a/include/bounce/softbody/softbody_contact_solver.h +++ b/include/bounce/softbody/softbody_contact_solver.h @@ -24,10 +24,10 @@ class b3StackAllocator; -class b3SoftBodyNode; +struct b3SoftBodyNode; class b3Body; -class b3NodeBodyContact; +struct b3NodeBodyContact; struct b3DenseVec3; diff --git a/include/bounce/softbody/softbody_node.h b/include/bounce/softbody/softbody_node.h index 81f7e28..00ef770 100644 --- a/include/bounce/softbody/softbody_node.h +++ b/include/bounce/softbody/softbody_node.h @@ -25,15 +25,11 @@ class b3Shape; class b3SoftBody; -class b3SoftBodyNode; +struct b3SoftBodyNode; // A contact between a node and a body -class b3NodeBodyContact +struct b3NodeBodyContact { -public: - b3NodeBodyContact() { } - ~b3NodeBodyContact() { } - b3SoftBodyNode* n1; b3Shape* s2; @@ -81,7 +77,7 @@ enum b3SoftBodyNodeType }; // A soft body node. -class b3SoftBodyNode +struct b3SoftBodyNode { public: // Set the node type. @@ -110,6 +106,12 @@ public: // Get the node mass. float32 GetMass() const; + // Set the node damping. + void SetDamping(float32 damping); + + // Get the node damping. + float32 GetDamping() const; + // Set the node radius. void SetRadius(float32 radius); @@ -151,6 +153,9 @@ private: // Inverse mass float32 m_invMass; + // Damping + float32 m_damping; + // Radius float32 m_radius; @@ -227,6 +232,16 @@ inline float32 b3SoftBodyNode::GetMass() const return m_mass; } +inline void b3SoftBodyNode::SetDamping(float32 damping) +{ + m_damping = damping; +} + +inline float32 b3SoftBodyNode::GetDamping() const +{ + return m_damping; +} + inline void b3SoftBodyNode::SetRadius(float32 radius) { m_radius = radius; diff --git a/include/bounce/softbody/softbody_solver.h b/include/bounce/softbody/softbody_solver.h index 3018b38..a38491b 100644 --- a/include/bounce/softbody/softbody_solver.h +++ b/include/bounce/softbody/softbody_solver.h @@ -27,10 +27,10 @@ class b3StackAllocator; class b3SoftBody; class b3SoftBodyMesh; -class b3SoftBodyNode; +struct b3SoftBodyNode; struct b3SoftBodyElement; -class b3NodeBodyContact; +struct b3NodeBodyContact; struct b3SoftBodySolverDef { diff --git a/src/bounce/softbody/softbody.cpp b/src/bounce/softbody/softbody.cpp index 6a66a6f..5712357 100644 --- a/src/bounce/softbody/softbody.cpp +++ b/src/bounce/softbody/softbody.cpp @@ -465,6 +465,7 @@ b3SoftBody::b3SoftBody(const b3SoftBodyDef& def) n->m_force.SetZero(); n->m_mass = 0.0f; n->m_invMass = 0.0f; + n->m_damping = 0.0f; n->m_radius = 0.0f; n->m_friction = 0.0f; n->m_userData = nullptr; diff --git a/src/bounce/softbody/softbody_solver.cpp b/src/bounce/softbody/softbody_solver.cpp index 5ced0ec..a00f8a5 100644 --- a/src/bounce/softbody/softbody_solver.cpp +++ b/src/bounce/softbody/softbody_solver.cpp @@ -195,6 +195,7 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter float32 inv_h = 1.0f / h; b3SparseMat33 M(m_mesh->vertexCount); + b3SparseMat33 C(m_mesh->vertexCount); b3DenseVec3 x(m_mesh->vertexCount); b3DenseVec3 p(m_mesh->vertexCount); b3DenseVec3 v(m_mesh->vertexCount); @@ -207,6 +208,12 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter b3SoftBodyNode* n = m_nodes + i; M(i, i) = b3Diagonal(n->m_mass); + + // Rayleigh damping + // C = alpha * M + beta * K + // Here the stiffness coefficient beta is zero + C(i, i) = b3Diagonal(n->m_damping * n->m_mass); + x[i] = m_mesh->vertices[i]; p[i] = n->m_position; v[i] = n->m_velocity; @@ -369,9 +376,8 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter f0 = -f0; - b3SparseMat33 A = M + h * h * K; + b3SparseMat33 A = M + h * C + h * h * K; - //b3DenseVec3 b = M * v - h * (K * p + f0 + f_plastic - fe); b3DenseVec3 b = M * v - h * (K * p + f0 - (f_plastic + fe)); // Solve Ax = b