Include Rayleigh damping. Use struct instead of class. Update PinnedSoftBody test
This commit is contained in:
parent
5e044795df
commit
b6f504b371
@ -32,7 +32,7 @@ public:
|
|||||||
b3SoftBodyDef def;
|
b3SoftBodyDef def;
|
||||||
def.mesh = &m_mesh;
|
def.mesh = &m_mesh;
|
||||||
def.density = 0.2f;
|
def.density = 0.2f;
|
||||||
def.E = 100.0f;
|
def.E = 1000.0f;
|
||||||
def.nu = 0.33f;
|
def.nu = 0.33f;
|
||||||
def.c_yield = 0.1f;
|
def.c_yield = 0.1f;
|
||||||
def.c_creep = 0.5f;
|
def.c_creep = 0.5f;
|
||||||
@ -40,6 +40,12 @@ public:
|
|||||||
|
|
||||||
m_body = new b3SoftBody(def);
|
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;
|
u32 pinIndex = ~0;
|
||||||
float32 pinDot = -B3_MAX_FLOAT;
|
float32 pinDot = -B3_MAX_FLOAT;
|
||||||
for (u32 i = 0; i < m_mesh.vertexCount; ++i)
|
for (u32 i = 0; i < m_mesh.vertexCount; ++i)
|
||||||
|
@ -26,7 +26,8 @@ class b3World;
|
|||||||
|
|
||||||
struct b3SoftBodyMesh;
|
struct b3SoftBodyMesh;
|
||||||
|
|
||||||
class b3SoftBodyNode;
|
struct b3SoftBodyNode;
|
||||||
|
struct b3SoftBodyElement;
|
||||||
|
|
||||||
struct b3RayCastInput;
|
struct b3RayCastInput;
|
||||||
struct b3RayCastOutput;
|
struct b3RayCastOutput;
|
||||||
|
@ -24,10 +24,10 @@
|
|||||||
|
|
||||||
class b3StackAllocator;
|
class b3StackAllocator;
|
||||||
|
|
||||||
class b3SoftBodyNode;
|
struct b3SoftBodyNode;
|
||||||
class b3Body;
|
class b3Body;
|
||||||
|
|
||||||
class b3NodeBodyContact;
|
struct b3NodeBodyContact;
|
||||||
|
|
||||||
struct b3DenseVec3;
|
struct b3DenseVec3;
|
||||||
|
|
||||||
|
@ -25,15 +25,11 @@
|
|||||||
|
|
||||||
class b3Shape;
|
class b3Shape;
|
||||||
class b3SoftBody;
|
class b3SoftBody;
|
||||||
class b3SoftBodyNode;
|
struct b3SoftBodyNode;
|
||||||
|
|
||||||
// A contact between a node and a body
|
// A contact between a node and a body
|
||||||
class b3NodeBodyContact
|
struct b3NodeBodyContact
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
b3NodeBodyContact() { }
|
|
||||||
~b3NodeBodyContact() { }
|
|
||||||
|
|
||||||
b3SoftBodyNode* n1;
|
b3SoftBodyNode* n1;
|
||||||
b3Shape* s2;
|
b3Shape* s2;
|
||||||
|
|
||||||
@ -81,7 +77,7 @@ enum b3SoftBodyNodeType
|
|||||||
};
|
};
|
||||||
|
|
||||||
// A soft body node.
|
// A soft body node.
|
||||||
class b3SoftBodyNode
|
struct b3SoftBodyNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Set the node type.
|
// Set the node type.
|
||||||
@ -110,6 +106,12 @@ public:
|
|||||||
// Get the node mass.
|
// Get the node mass.
|
||||||
float32 GetMass() const;
|
float32 GetMass() const;
|
||||||
|
|
||||||
|
// Set the node damping.
|
||||||
|
void SetDamping(float32 damping);
|
||||||
|
|
||||||
|
// Get the node damping.
|
||||||
|
float32 GetDamping() const;
|
||||||
|
|
||||||
// Set the node radius.
|
// Set the node radius.
|
||||||
void SetRadius(float32 radius);
|
void SetRadius(float32 radius);
|
||||||
|
|
||||||
@ -151,6 +153,9 @@ private:
|
|||||||
// Inverse mass
|
// Inverse mass
|
||||||
float32 m_invMass;
|
float32 m_invMass;
|
||||||
|
|
||||||
|
// Damping
|
||||||
|
float32 m_damping;
|
||||||
|
|
||||||
// Radius
|
// Radius
|
||||||
float32 m_radius;
|
float32 m_radius;
|
||||||
|
|
||||||
@ -227,6 +232,16 @@ inline float32 b3SoftBodyNode::GetMass() const
|
|||||||
return m_mass;
|
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)
|
inline void b3SoftBodyNode::SetRadius(float32 radius)
|
||||||
{
|
{
|
||||||
m_radius = radius;
|
m_radius = radius;
|
||||||
|
@ -27,10 +27,10 @@ class b3StackAllocator;
|
|||||||
class b3SoftBody;
|
class b3SoftBody;
|
||||||
class b3SoftBodyMesh;
|
class b3SoftBodyMesh;
|
||||||
|
|
||||||
class b3SoftBodyNode;
|
struct b3SoftBodyNode;
|
||||||
struct b3SoftBodyElement;
|
struct b3SoftBodyElement;
|
||||||
|
|
||||||
class b3NodeBodyContact;
|
struct b3NodeBodyContact;
|
||||||
|
|
||||||
struct b3SoftBodySolverDef
|
struct b3SoftBodySolverDef
|
||||||
{
|
{
|
||||||
|
@ -465,6 +465,7 @@ b3SoftBody::b3SoftBody(const b3SoftBodyDef& def)
|
|||||||
n->m_force.SetZero();
|
n->m_force.SetZero();
|
||||||
n->m_mass = 0.0f;
|
n->m_mass = 0.0f;
|
||||||
n->m_invMass = 0.0f;
|
n->m_invMass = 0.0f;
|
||||||
|
n->m_damping = 0.0f;
|
||||||
n->m_radius = 0.0f;
|
n->m_radius = 0.0f;
|
||||||
n->m_friction = 0.0f;
|
n->m_friction = 0.0f;
|
||||||
n->m_userData = nullptr;
|
n->m_userData = nullptr;
|
||||||
|
@ -195,6 +195,7 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter
|
|||||||
float32 inv_h = 1.0f / h;
|
float32 inv_h = 1.0f / h;
|
||||||
|
|
||||||
b3SparseMat33 M(m_mesh->vertexCount);
|
b3SparseMat33 M(m_mesh->vertexCount);
|
||||||
|
b3SparseMat33 C(m_mesh->vertexCount);
|
||||||
b3DenseVec3 x(m_mesh->vertexCount);
|
b3DenseVec3 x(m_mesh->vertexCount);
|
||||||
b3DenseVec3 p(m_mesh->vertexCount);
|
b3DenseVec3 p(m_mesh->vertexCount);
|
||||||
b3DenseVec3 v(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;
|
b3SoftBodyNode* n = m_nodes + i;
|
||||||
|
|
||||||
M(i, i) = b3Diagonal(n->m_mass);
|
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];
|
x[i] = m_mesh->vertices[i];
|
||||||
p[i] = n->m_position;
|
p[i] = n->m_position;
|
||||||
v[i] = n->m_velocity;
|
v[i] = n->m_velocity;
|
||||||
@ -369,9 +376,8 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter
|
|||||||
|
|
||||||
f0 = -f0;
|
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));
|
b3DenseVec3 b = M * v - h * (K * p + f0 - (f_plastic + fe));
|
||||||
|
|
||||||
// Solve Ax = b
|
// Solve Ax = b
|
||||||
|
Loading…
x
Reference in New Issue
Block a user