store tension action force inside spring, make spring output force and derivative for abstraction, cleanup

This commit is contained in:
Irlan
2018-05-25 00:00:07 -03:00
parent bb9839321d
commit 8b775361a9
5 changed files with 191 additions and 204 deletions

View File

@ -77,21 +77,18 @@ enum b3ParticleType
// Read-only particle
struct b3Particle
{
// Particle type
// Type
b3ParticleType type;
// Mass position
// Position
b3Vec3 position;
// Mass velocity
// Velocity
b3Vec3 velocity;
// Mass force
// Applied external force
b3Vec3 force;
// Mass tension force for visualization
b3Vec3 tension;
// Mass
float32 mass;
@ -123,6 +120,8 @@ enum b3SpringType
e_bendSpring,
};
struct b3ClothSolverData;
// Read-only spring
struct b3Spring
{
@ -143,6 +142,17 @@ struct b3Spring
// Damping stiffness
float32 kd;
// Solver temp
// Action tensile force (f_i entry)
b3Vec3 tension;
// Jacobian (J_ii entry)
b3Mat33 Jx, Jv;
// Initialize solver data.
void Initialize(const b3ClothSolverData* data);
};
// Read-only contact
@ -182,6 +192,10 @@ public:
// Return the particle at a given index in this cloth.
b3Particle* GetParticle(u32 i) const;
// Convenience function.
// Return the index of a given particle.
u32 GetParticleIndex(const b3Particle* p) const;
// Set the type of a given particle.
void SetType(b3Particle* p, b3ParticleType type);
@ -194,6 +208,12 @@ public:
// Apply a force to a given particle.
void ApplyForce(b3Particle* p, const b3Vec3& force);
// Return the number of springs in this cloth.
u32 GetSpringCount() const;
// Return the spring at a given index in this cloth.
b3Spring* GetSpring(u32 i) const;
// Return the kinetic (or dynamic) energy in this system.
float32 GetEnergy() const;
@ -273,6 +293,11 @@ inline b3Particle* b3Cloth::GetParticle(u32 i) const
return m_particles + i;
}
inline u32 b3Cloth::GetParticleIndex(const b3Particle* p) const
{
return u32(p - m_particles);
}
inline void b3Cloth::SetType(b3Particle* p, b3ParticleType type)
{
if (p->type == type)
@ -319,6 +344,17 @@ inline void b3Cloth::ApplyForce(b3Particle* p, const b3Vec3& force)
p->force += force;
}
inline u32 b3Cloth::GetSpringCount() const
{
return m_springCount;
}
inline b3Spring* b3Cloth::GetSpring(u32 i) const
{
B3_ASSERT(i < m_springCount);
return m_springs + i;
}
inline float32 b3Cloth::GetEnergy() const
{
float32 E = 0.0f;

View File

@ -41,6 +41,15 @@ struct b3ClothSolverDef
u32 contactCapacity;
};
struct b3ClothSolverData
{
b3Vec3* x;
b3Vec3* v;
b3Vec3* f;
float32 dt;
float32 invdt;
};
class b3ClothSolver
{
public:
@ -53,9 +62,6 @@ public:
void Solve(float32 dt, const b3Vec3& gravity);
private:
// Compute forces.
void Compute_f(b3DenseVec3& f, const b3DenseVec3& x, const b3DenseVec3& v, const b3Vec3& gravity);
// Compute A and b in Ax = b
void Compute_A_b(b3SparseMat33& A, b3DenseVec3& b, const b3DenseVec3& f, const b3DenseVec3& x, const b3DenseVec3& v, const b3DenseVec3& y) const;
@ -71,8 +77,6 @@ private:
b3StackAllocator* m_allocator;
float32 m_h;
u32 m_particleCapacity;
u32 m_particleCount;
b3Particle** m_particles;
@ -80,12 +84,12 @@ private:
u32 m_springCapacity;
u32 m_springCount;
b3Spring** m_springs;
b3Mat33* m_Jx;
b3Mat33* m_Jv;
u32 m_contactCapacity;
u32 m_contactCount;
b3ParticleContact** m_contacts;
b3ClothSolverData m_solverData;
};
#endif