Support kinematic nodes
This commit is contained in:
parent
df21ca37d7
commit
0e5262629d
@ -69,10 +69,12 @@ struct b3NodeBodyContactWorldPoint
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Static node: Can be moved manually.
|
// Static node: Can be moved manually.
|
||||||
|
// Kinematic node: Non-zero velocity, can be moved by the solver.
|
||||||
// Dynamic node: Non-zero velocity determined by force, can be moved by the solver.
|
// Dynamic node: Non-zero velocity determined by force, can be moved by the solver.
|
||||||
enum b3SoftBodyNodeType
|
enum b3SoftBodyNodeType
|
||||||
{
|
{
|
||||||
e_staticSoftBodyNode,
|
e_staticSoftBodyNode,
|
||||||
|
e_kinematicSoftBodyNode,
|
||||||
e_dynamicSoftBodyNode
|
e_dynamicSoftBodyNode
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -839,6 +839,11 @@ void b3SoftBody::Draw() const
|
|||||||
b3Draw_draw->DrawPoint(v, 4.0f, b3Color_white);
|
b3Draw_draw->DrawPoint(v, 4.0f, b3Color_white);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (n->m_type == e_kinematicSoftBodyNode)
|
||||||
|
{
|
||||||
|
b3Draw_draw->DrawPoint(v, 4.0f, b3Color_blue);
|
||||||
|
}
|
||||||
|
|
||||||
if (n->m_type == e_dynamicSoftBodyNode)
|
if (n->m_type == e_dynamicSoftBodyNode)
|
||||||
{
|
{
|
||||||
b3Draw_draw->DrawPoint(v, 4.0f, b3Color_green);
|
b3Draw_draw->DrawPoint(v, 4.0f, b3Color_green);
|
||||||
|
@ -92,7 +92,7 @@ static void b3ExtractRotation(b3Mat33& out, b3Quat& q, const b3Mat33& A, u32 max
|
|||||||
|
|
||||||
static void b3SolveMPCG(b3DenseVec3& x,
|
static void b3SolveMPCG(b3DenseVec3& x,
|
||||||
const b3SparseMat33& A, const b3DenseVec3& b,
|
const b3SparseMat33& A, const b3DenseVec3& b,
|
||||||
const b3DenseVec3& x0, const b3DiagMat33& S, u32 maxIterations = 20)
|
const b3DenseVec3& z, const b3DiagMat33& S, u32 maxIterations = 20)
|
||||||
{
|
{
|
||||||
b3DiagMat33 P(A.rowCount);
|
b3DiagMat33 P(A.rowCount);
|
||||||
b3DiagMat33 invP(A.rowCount);
|
b3DiagMat33 invP(A.rowCount);
|
||||||
@ -116,7 +116,7 @@ static void b3SolveMPCG(b3DenseVec3& x,
|
|||||||
invP[i] = b3Diagonal(D.x.x, D.y.y, D.z.z);
|
invP[i] = b3Diagonal(D.x.x, D.y.y, D.z.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
x = x0;
|
x = z;
|
||||||
|
|
||||||
float32 delta_0 = b3Dot(S * b, P * (S * b));
|
float32 delta_0 = b3Dot(S * b, P * (S * b));
|
||||||
|
|
||||||
@ -200,7 +200,7 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter
|
|||||||
b3DenseVec3 p(m_mesh->vertexCount);
|
b3DenseVec3 p(m_mesh->vertexCount);
|
||||||
b3DenseVec3 v(m_mesh->vertexCount);
|
b3DenseVec3 v(m_mesh->vertexCount);
|
||||||
b3DenseVec3 fe(m_mesh->vertexCount);
|
b3DenseVec3 fe(m_mesh->vertexCount);
|
||||||
b3DenseVec3 x0(m_mesh->vertexCount);
|
b3DenseVec3 z(m_mesh->vertexCount);
|
||||||
b3DiagMat33 S(m_mesh->vertexCount);
|
b3DiagMat33 S(m_mesh->vertexCount);
|
||||||
|
|
||||||
for (u32 i = 0; i < m_mesh->vertexCount; ++i)
|
for (u32 i = 0; i < m_mesh->vertexCount; ++i)
|
||||||
@ -218,7 +218,7 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter
|
|||||||
p[i] = n->m_position;
|
p[i] = n->m_position;
|
||||||
v[i] = n->m_velocity;
|
v[i] = n->m_velocity;
|
||||||
fe[i] = n->m_force;
|
fe[i] = n->m_force;
|
||||||
x0[i] = n->m_velocity;
|
z[i] = n->m_velocity;
|
||||||
|
|
||||||
// Apply gravity
|
// Apply gravity
|
||||||
if (n->m_type == e_dynamicSoftBodyNode)
|
if (n->m_type == e_dynamicSoftBodyNode)
|
||||||
@ -382,7 +382,7 @@ void b3SoftBodySolver::Solve(float32 dt, const b3Vec3& gravity, u32 velocityIter
|
|||||||
|
|
||||||
// Solve Ax = b
|
// Solve Ax = b
|
||||||
b3DenseVec3 sx(m_mesh->vertexCount);
|
b3DenseVec3 sx(m_mesh->vertexCount);
|
||||||
b3SolveMPCG(sx, A, b, x0, S);
|
b3SolveMPCG(sx, A, b, z, S);
|
||||||
|
|
||||||
// Solve constraints
|
// Solve constraints
|
||||||
b3SoftBodyContactSolverDef contactSolverDef;
|
b3SoftBodyContactSolverDef contactSolverDef;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user