Bullet Collision Detection & Physics Library
btReducedDeformableBody.h
Go to the documentation of this file.
1#ifndef BT_REDUCED_SOFT_BODY_H
2#define BT_REDUCED_SOFT_BODY_H
3
4#include "../btSoftBody.h"
9
10// Reduced deformable body is a simplified deformable object embedded in a rigid frame.
12{
13 public:
14 //
15 // Typedefs
16 //
18 // typedef btAlignedObjectArray<btMatrix3x3> tBlockDiagMatrix;
21
22 private:
23 // flag to turn off the reduced modes
25
26 // Flags for transform. Once transform is applied, users cannot scale the mesh or change its total mass.
28
29 // scaling factors
30 btScalar m_rhoScale; // mass density scale
31 btScalar m_ksScale; // stiffness scale
32
33 // projection matrix
34 tDenseMatrix m_projPA; // Eqn. 4.11 from Rahul Sheth's thesis
38
40
44
45 btVector3 m_linearVelocityFromReduced; // contribution to the linear velocity from reduced velocity
46 btVector3 m_angularVelocityFromReduced; // contribution to the angular velocity from reduced velocity
48
49 protected:
50 // rigid frame
51 btScalar m_mass; // total mass of the rigid frame
52 btScalar m_inverseMass; // inverse of the total mass of the rigid frame
55 btScalar m_linearDamping; // linear damping coefficient
56 btScalar m_angularDamping; // angular damping coefficient
59 // btVector3 m_invInertiaLocal;
65 btVector3 m_initialCoM; // initial center of mass (original of the m_rigidTransformWorld)
66
67 // damping
70
71 public:
72 //
73 // Fields
74 //
75
76 // reduced space
79 tDenseMatrix m_modes; // modes of the reduced deformable model. Each inner array is a mode, outer array size = n_modes
80 tDenseArray m_reducedDofs; // Reduced degree of freedom
81 tDenseArray m_reducedDofsBuffer; // Reduced degree of freedom at t^n
82 tDenseArray m_reducedVelocity; // Reduced velocity array
83 tDenseArray m_reducedVelocityBuffer; // Reduced velocity array at t^n
84 tDenseArray m_reducedForceExternal; // reduced external force
85 tDenseArray m_reducedForceElastic; // reduced internal elastic force
86 tDenseArray m_reducedForceDamping; // reduced internal damping force
87 tDenseArray m_eigenvalues; // eigenvalues of the reduce deformable model
88 tDenseArray m_Kr; // reduced stiffness matrix
89
90 // full space
91 TVStack m_x0; // Rest position
92 tDenseArray m_nodalMass; // Mass on each node
93 btAlignedObjectArray<int> m_fixedNodes; // index of the fixed nodes
94 int m_nodeIndexOffset; // offset of the node index needed for contact solver when there are multiple reduced deformable body in the world.
95
96 // contacts
98
99 //
100 // Api
101 //
103
105
106 //
107 // initializing helpers
108 //
110
111 void setReducedModes(int num_modes, int full_size);
112
114
115 void setInertiaProps();
116
117 void setRigidVelocity(const btVector3& v);
118
120
121 void setStiffnessScale(const btScalar ks);
122
123 void setMassScale(const btScalar rho);
124
125 void setFixedNodes(const int n_node);
126
127 void setDamping(const btScalar alpha, const btScalar beta);
128
129 void disableReducedModes(const bool rigid_only);
130
131 virtual void setTotalMass(btScalar mass, bool fromfaces = false);
132
133 //
134 // various internal updates
135 //
136 virtual void transformTo(const btTransform& trs);
137 virtual void transform(const btTransform& trs);
138 // caution:
139 // need to use scale before using transform, because the scale is performed in the local frame
140 // (i.e., may have some rotation already, but the m_rigidTransformWorld doesn't have this info)
141 virtual void scale(const btVector3& scl);
142
143 private:
145
147
149
150 void updateInertiaTensor();
151
153
154 public:
156
158
159 // update the external force projection matrix
161
163
165
166 //
167 // position and velocity update related
168 //
169
170 // compute reduced degree of freedoms
172
173 // compute reduced velocity update (for explicit time stepping)
175
176 // map to full degree of freedoms
178
179 // compute full space velocity from the reduced velocity
181
182 // compute total angular momentum
184
185 // get a single node's full space velocity from the reduced velocity
187
188 // get a single node's all delta velocity
190
191 //
192 // rigid motion related
193 //
194 void applyDamping(btScalar timeStep);
195
197
199
201
202 //
203 // force related
204 //
205
206 // apply impulse to the rigid frame
208
209 // apply impulse to nodes in the full space
211
212 // apply nodal external force in the full space
214
215 // apply gravity to the rigid frame
217
218 // apply reduced elastic force
220
221 // apply reduced damping force
223
224 // calculate the impulse factor
226
227 // get relative position from a node to the CoM of the rigid frame
229
230 //
231 // accessors
232 //
233 bool isReducedModesOFF() const;
234 btScalar getTotalMass() const;
236 const btVector3& getLinearVelocity() const;
237 const btVector3& getAngularVelocity() const;
238
239 #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0
240 void clampVelocity(btVector3& v) const {
241 v.setX(
244 );
245 v.setY(
248 );
249 v.setZ(
252 );
253 }
254 #endif
255};
256
257#endif // BT_REDUCED_SOFT_BODY_H
const T & btMax(const T &a, const T &b)
Definition btMinMax.h:27
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:314
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
Definition btMatrix3x3.h:50
void applyFullSpaceNodalForce(const btVector3 &f_ext, int n_node)
void predictIntegratedTransform(btScalar dt, btTransform &predictedTransform)
void applyTorqueImpulse(const btVector3 &torque)
btAlignedObjectArray< btScalar > tDenseArray
const btVector3 computeNodeFullVelocity(const btTransform &ref_trans, int n_node) const
btVector3 getRelativePos(int n_node)
btAlignedObjectArray< int > m_fixedNodes
virtual void transform(const btTransform &trs)
void mapToFullVelocity(const btTransform &ref_trans)
const btVector3 & getAngularVelocity() const
void setRigidAngularVelocity(const btVector3 &omega)
void setReducedModes(int num_modes, int full_size)
void updateReducedVelocity(btScalar solverdt)
void disableReducedModes(const bool rigid_only)
btAlignedObjectArray< btVector3 > TVStack
const btVector3 & getLinearVelocity() const
void updateModesByRotation(const btMatrix3x3 &rotation)
virtual btMatrix3x3 getImpulseFactor(int n_node)
void setRigidVelocity(const btVector3 &v)
const btVector3 internalComputeNodeDeltaVelocity(const btTransform &ref_trans, int n_node) const
const btVector3 computeTotalAngularMomentum() const
btAlignedObjectArray< btAlignedObjectArray< btScalar > > tDenseMatrix
void applyCentralImpulse(const btVector3 &impulse)
void updateExternalForceProjectMatrix(bool initialized)
void applyReducedElasticForce(const tDenseArray &reduce_dofs)
void internalApplyFullSpaceImpulse(const btVector3 &impulse, const btVector3 &rel_pos, int n_node, btScalar dt)
void applyReducedDampingForce(const tDenseArray &reduce_vel)
void setDamping(const btScalar alpha, const btScalar beta)
void setStiffnessScale(const btScalar ks)
void setMassScale(const btScalar rho)
void applyDamping(btScalar timeStep)
void updateInitialInertiaTensor(const btMatrix3x3 &rotation)
void internalApplyRigidImpulse(const btVector3 &impulse, const btVector3 &rel_pos)
void setFixedNodes(const int n_node)
void setMassProps(const tDenseArray &mass_array)
virtual void transformTo(const btTransform &trs)
virtual void scale(const btVector3 &scl)
void applyRigidGravity(const btVector3 &gravity, btScalar dt)
void updateReducedDofs(btScalar solverdt)
void proceedToTransform(btScalar dt, bool end_of_time_step)
void mapToFullPosition(const btTransform &ref_trans)
btAlignedObjectArray< int > m_contactNodesList
virtual void setTotalMass(btScalar mass, bool fromfaces=false)
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
Definition btSoftBody.h:75
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:30
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:82
const btScalar & getZ() const
Return the z value.
Definition btVector3.h:565
void setZ(btScalar _z)
Set the z value.
Definition btVector3.h:571
void setY(btScalar _y)
Set the y value.
Definition btVector3.h:569
void setX(btScalar _x)
Set the x value.
Definition btVector3.h:567
const btScalar & getY() const
Return the y value.
Definition btVector3.h:563
const btScalar & getX() const
Return the x value.
Definition btVector3.h:561