typo, optimization, consistency

This commit is contained in:
Irlan
2018-05-25 22:15:00 -03:00
parent 03be41d05b
commit 8d2affb0b2
4 changed files with 144 additions and 91 deletions

View File

@ -64,9 +64,9 @@ struct b3ClothDef
float32 kd;
};
// Static particles have zero mass and velocity, and therefore they can't move.
// Kinematic particles are't moved by external and internal forces but can be moved by contact forces.
// Dynamic particles have non-zero mass and can move due to internal and external forces.
// Static particle: Has zero mass, can be moved manually.
// Kinematic particle: Has zero mass, non-zero velocity, can be moved by the solver.
// Dynamic particle: Has non-zero mass, non-zero velocity determined by force, can be moved by the solver.
enum b3ParticleType
{
e_staticParticle,
@ -98,10 +98,10 @@ struct b3Particle
// Radius
float32 radius;
// User data
// User data.
void* userData;
// Translation used for direct position manipulation
// Applied external translation
b3Vec3 translation;
// Solver temp
@ -125,6 +125,8 @@ struct b3ClothSolverData;
// Read-only spring
struct b3Spring
{
// Solver shared
// Spring type
b3SpringType type;
@ -151,8 +153,8 @@ struct b3Spring
// Jacobian (J_ii entry)
b3Mat33 Jx, Jv;
// Initialize solver data.
void Initialize(const b3ClothSolverData* data);
// Apply spring forces.
void ApplyForces(const b3ClothSolverData* data);
};
// Read-only contact
@ -160,6 +162,7 @@ struct b3ParticleContact
{
b3Particle* p1;
b3Shape* s2;
float32 s;
b3Vec3 n, t1, t2;
float32 Fn, Ft1, Ft2;
bool n_active, t1_active, t2_active;
@ -254,8 +257,8 @@ protected:
u32 m_particleCount;
b3Particle* m_particles;
b3Spring* m_springs;
u32 m_springCount;
b3Spring* m_springs;
b3ParticleContact* m_contacts;
//u32 m_contactCount;

View File

@ -50,6 +50,13 @@ struct b3ClothSolverData
float32 invdt;
};
struct b3AccelerationConstraint
{
u32 i1;
u32 ndof;
b3Vec3 p, q, z;
};
class b3ClothSolver
{
public:
@ -62,17 +69,16 @@ public:
void Solve(float32 dt, const b3Vec3& gravity);
private:
// Initialize constraints.
void InitializeConstraints();
// 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;
// Compute S.
void Compute_S(b3DiagMat33& S);
// Compute z.
void Compute_z(b3DenseVec3& z);
// Compute S and z.
void Compute_S_z(b3DiagMat33& S, b3DenseVec3& z);
// Solve Ax = b.
// Output x and the residual error f = Ax - b ~ 0.
void Solve(b3DenseVec3& x, u32& iterations, const b3SparseMat33& A, const b3DenseVec3& b, const b3DiagMat33& S, const b3DenseVec3& z, const b3DenseVec3& y) const;
b3StackAllocator* m_allocator;
@ -89,6 +95,10 @@ private:
u32 m_contactCount;
b3ParticleContact** m_contacts;
u32 m_constraintCapacity;
u32 m_constraintCount;
b3AccelerationConstraint* m_constraints;
b3ClothSolverData m_solverData;
};