Bullet Collision Detection & Physics Library
btSoftBody.h
Go to the documentation of this file.
1/*
2Bullet Continuous Collision Detection and Physics Library
3Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4
5This software is provided 'as-is', without any express or implied warranty.
6In no event will the authors be held liable for any damages arising from the use of this software.
7Permission is granted to anyone to use this software for any purpose,
8including commercial applications, and to alter it and redistribute it freely,
9subject to the following restrictions:
10
111. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
122. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
133. This notice may not be removed or altered from any source distribution.
14*/
16
17#ifndef _BT_SOFT_BODY_H
18#define _BT_SOFT_BODY_H
19
25
28#include "btSparseSDF.h"
32//#ifdef BT_USE_DOUBLE_PRECISION
33//#define btRigidBodyData btRigidBodyDoubleData
34//#define btRigidBodyDataName "btRigidBodyDoubleData"
35//#else
36#define btSoftBodyData btSoftBodyFloatData
37#define btSoftBodyDataName "btSoftBodyFloatData"
39static unsigned long seed = 243703;
40//#endif //BT_USE_DOUBLE_PRECISION
41
43class btDispatcher;
45
46/* btSoftBodyWorldInfo */
48{
58
60 : air_density((btScalar)1.2),
62 water_offset(0),
63 m_maxDisplacement(1000.f), //avoid soft body from 'exploding' so use some upper threshold of maximum motion that a node can travel per frame
64 water_normal(0, 0, 0),
65 m_broadphase(0),
66 m_dispatcher(0),
67 m_gravity(0, -10, 0)
68 {
69 }
70};
71
75{
76public:
78
79 // The solver object that handles this soft body
81
82 //
83 // Enumerations
84 //
85
101
103 struct eVSolver
104 {
105 enum _
106 {
109 };
110 };
111
113 struct ePSolver
114 {
123 };
124
136
138 struct eFeature
139 {
149 };
150
153
154 //
155 // Flags
156 //
157
160 {
161 enum _
162 {
163 RVSmask = 0x000f,
164 SDF_RS = 0x0001,
165 CL_RS = 0x0002,
166 SDF_RD = 0x0004,
167
168 SVSmask = 0x00f0,
169 VF_SS = 0x0010,
170 CL_SS = 0x0020,
171 CL_SELF = 0x0040,
172 VF_DD = 0x0080,
173
174 RVDFmask = 0x0f00,
175 SDF_RDF = 0x0100,
176 SDF_MDF = 0x0200,
177 SDF_RDN = 0x0400,
178 /* presets */
181 };
182 };
183
186 {
187 enum _
188 {
189 DebugDraw = 0x0001,
190 /* presets */
193 };
194 };
195
196 //
197 // API Types
198 //
199
200 /* sRayCast */
208
209 /* ImplicitFn */
211 {
212 virtual ~ImplicitFn() {}
213 virtual btScalar Eval(const btVector3& x) = 0;
214 };
215
216 //
217 // Internal types
218 //
219
222
223 /* sCti is Softbody contact info */
224 struct sCti
225 {
226 const btCollisionObject* m_colObj; /* Rigid body */
227 btVector3 m_normal; /* Outward normal */
228 btScalar m_offset; /* Offset from origin */
229 btVector3 m_bary; /* Barycentric weights for faces */
230 };
231
232 /* sMedium */
233 struct sMedium
234 {
235 btVector3 m_velocity; /* Velocity */
236 btScalar m_pressure; /* Pressure */
237 btScalar m_density; /* Density */
238 };
239
240 /* Base type */
241 struct Element
242 {
243 void* m_tag; // User data
244 Element() : m_tag(0) {}
245 };
246 /* Material */
248 {
249 btScalar m_kLST; // Linear stiffness coefficient [0,1]
250 btScalar m_kAST; // Area/Angular stiffness coefficient [0,1]
251 btScalar m_kVST; // Volume stiffness coefficient [0,1]
252 int m_flags; // Flags
253 };
254
255 /* Feature */
257 {
258 Material* m_material; // Material
259 };
260 /* Node */
267 struct Node : Feature
268 {
269 btVector3 m_x; // Position
270 btVector3 m_q; // Previous step position/Test position
271 btVector3 m_v; // Velocity
272 btVector3 m_vn; // Previous step velocity
273 btVector3 m_f; // Force accumulator
274 btVector3 m_n; // Normal
275 btScalar m_im; // 1/mass
277 btDbvtNode* m_leaf; // Leaf data
278 int m_constrained; // depth of penetration
279 int m_battach : 1; // Attached
280 int index;
281 btVector3 m_splitv; // velocity associated with split impulse
282 btMatrix3x3 m_effectiveMass; // effective mass in contact
283 btMatrix3x3 m_effectiveMass_inv; // inverse of effective mass
284 };
285 /* Link */
287 Link : Feature
288 {
289 btVector3 m_c3; // gradient
290 Node* m_n[2]; // Node pointers
291 btScalar m_rl; // Rest length
292 int m_bbending : 1; // Bending link
293 btScalar m_c0; // (ima+imb)*kLST
294 btScalar m_c1; // rl^2
295 btScalar m_c2; // |gradient|^2/c0
296
298 };
300 {
301 RenderNode* m_n[3]; // Node pointers
302 };
303
304 /* Face */
305 struct Face : Feature
306 {
307 Node* m_n[3]; // Node pointers
309 btScalar m_ra; // Rest area
310 btDbvtNode* m_leaf; // Leaf data
311 btVector4 m_pcontact; // barycentric weights of the persistent contact
314 };
315 /* Tetra */
316 struct Tetra : Feature
317 {
318 Node* m_n[4]; // Node pointers
319 btScalar m_rv; // Rest volume
320 btDbvtNode* m_leaf; // Leaf data
321 btVector3 m_c0[4]; // gradients
322 btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3)
323 btScalar m_c2; // m_c1/sum(|g0..3|^2)
327 btVector4 m_P_inv[3]; // first three columns of P_inv matrix
328 };
329
330 /* TetraScratch */
332 {
333 btMatrix3x3 m_F; // deformation gradient F
334 btScalar m_trace; // trace of F^T * F
335 btScalar m_J; // det(F)
336 btMatrix3x3 m_cofF; // cofactor of F
337 btMatrix3x3 m_corotation; // corotatio of the tetra
338 };
339
340 /* RContact */
341 struct RContact
342 {
343 sCti m_cti; // Contact infos
344 Node* m_node; // Owner node
345 btMatrix3x3 m_c0; // Impulse matrix
346 btVector3 m_c1; // Relative anchor
347 btScalar m_c2; // ima*dt
348 btScalar m_c3; // Friction
349 btScalar m_c4; // Hardness
350
351 // jacobians and unit impulse responses for multibody
357 };
358
360 {
361 public:
362 sCti m_cti; // Contact infos
363 btMatrix3x3 m_c0; // Impulse matrix
364 btVector3 m_c1; // Relative anchor
365 btScalar m_c2; // inverse mass of node/face
366 btScalar m_c3; // Friction
367 btScalar m_c4; // Hardness
368 btMatrix3x3 m_c5; // inverse effective mass
369
370 // jacobians and unit impulse responses for multibody
376 };
377
379 {
380 public:
381 Node* m_node; // Owner node
382 };
383
385 {
386 public:
387 btVector3 m_local; // Anchor position in body space
388 };
389
391 {
392 public:
393 Face* m_face; // Owner face
394 btVector3 m_contactPoint; // Contact point
395 btVector3 m_bary; // Barycentric weights
396 btVector3 m_weights; // v_contactPoint * m_weights[i] = m_face->m_node[i]->m_v;
397 };
398
400 {
401 Node* m_node; // Node
402 Face* m_face; // Face
403 btVector3 m_bary; // Barycentric weights
404 btVector3 m_weights; // v_contactPoint * m_weights[i] = m_face->m_node[i]->m_v;
407 btScalar m_friction; // Friction
408 btScalar m_imf; // inverse mass of the face at contact point
409 btScalar m_c0; // scale of the impulse matrix;
410 };
411
412 /* SContact */
413 struct SContact
414 {
415 Node* m_node; // Node
416 Face* m_face; // Face
420 btScalar m_friction; // Friction
421 btScalar m_cfm[2]; // Constraint force mixing
422 };
423 /* Anchor */
424 struct Anchor
425 {
426 Node* m_node; // Node pointer
427 btVector3 m_local; // Anchor position in body space
430 btMatrix3x3 m_c0; // Impulse matrix
431 btVector3 m_c1; // Relative anchor
432 btScalar m_c2; // ima*dt
433 };
434 /* Note */
435 struct Note : Element
436 {
437 const char* m_text; // Text
439 int m_rank; // Rank
440 Node* m_nodes[4]; // Nodes
441 btScalar m_coords[4]; // Coordinates
442 };
443 /* Pose */
444 struct Pose
445 {
446 bool m_bvolume; // Is valid
447 bool m_bframe; // Is frame
448 btScalar m_volume; // Rest volume
449 tVector3Array m_pos; // Reference positions
450 tScalarArray m_wgh; // Weights
452 btMatrix3x3 m_rot; // Rotation
454 btMatrix3x3 m_aqq; // Base scaling
455 };
456 /* Cluster */
488 /* Impulse */
489 struct Impulse
490 {
494 int m_asDrift : 1;
495 Impulse() : m_velocity(0, 0, 0), m_drift(0, 0, 0), m_asVelocity(0), m_asDrift(0) {}
497 {
498 Impulse i = *this;
499 i.m_velocity = -i.m_velocity;
500 i.m_drift = -i.m_drift;
501 return (i);
502 }
504 {
505 Impulse i = *this;
506 i.m_velocity *= x;
507 i.m_drift *= x;
508 return (i);
509 }
510 };
511 /* Body */
512 struct Body
513 {
517
524
525 void activate() const
526 {
527 if (m_rigid)
528 m_rigid->activate();
530 m_collisionObject->activate();
531 }
533 {
534 static const btMatrix3x3 iwi(0, 0, 0, 0, 0, 0, 0, 0, 0);
535 if (m_rigid) return (m_rigid->getInvInertiaTensorWorld());
536 if (m_soft) return (m_soft->m_invwi);
537 return (iwi);
538 }
540 {
541 if (m_rigid) return (m_rigid->getInvMass());
542 if (m_soft) return (m_soft->m_imass);
543 return (0);
544 }
545 const btTransform& xform() const
546 {
547 static const btTransform identity = btTransform::getIdentity();
548 if (m_collisionObject) return (m_collisionObject->getWorldTransform());
549 if (m_soft) return (m_soft->m_framexform);
550 return (identity);
551 }
553 {
554 if (m_rigid) return (m_rigid->getLinearVelocity());
555 if (m_soft) return (m_soft->m_lv);
556 return (btVector3(0, 0, 0));
557 }
559 {
560 if (m_rigid) return (btCross(m_rigid->getAngularVelocity(), rpos));
561 if (m_soft) return (btCross(m_soft->m_av, rpos));
562 return (btVector3(0, 0, 0));
563 }
565 {
566 if (m_rigid) return (m_rigid->getAngularVelocity());
567 if (m_soft) return (m_soft->m_av);
568 return (btVector3(0, 0, 0));
569 }
570 btVector3 velocity(const btVector3& rpos) const
571 {
572 return (linearVelocity() + angularVelocity(rpos));
573 }
574 void applyVImpulse(const btVector3& impulse, const btVector3& rpos) const
575 {
576 if (m_rigid) m_rigid->applyImpulse(impulse, rpos);
577 if (m_soft) btSoftBody::clusterVImpulse(m_soft, rpos, impulse);
578 }
579 void applyDImpulse(const btVector3& impulse, const btVector3& rpos) const
580 {
581 if (m_rigid) m_rigid->applyImpulse(impulse, rpos);
582 if (m_soft) btSoftBody::clusterDImpulse(m_soft, rpos, impulse);
583 }
584 void applyImpulse(const Impulse& impulse, const btVector3& rpos) const
585 {
586 if (impulse.m_asVelocity)
587 {
588 // printf("impulse.m_velocity = %f,%f,%f\n",impulse.m_velocity.getX(),impulse.m_velocity.getY(),impulse.m_velocity.getZ());
589 applyVImpulse(impulse.m_velocity, rpos);
590 }
591 if (impulse.m_asDrift)
592 {
593 // printf("impulse.m_drift = %f,%f,%f\n",impulse.m_drift.getX(),impulse.m_drift.getY(),impulse.m_drift.getZ());
594 applyDImpulse(impulse.m_drift, rpos);
595 }
596 }
597 void applyVAImpulse(const btVector3& impulse) const
598 {
599 if (m_rigid) m_rigid->applyTorqueImpulse(impulse);
601 }
602 void applyDAImpulse(const btVector3& impulse) const
603 {
604 if (m_rigid) m_rigid->applyTorqueImpulse(impulse);
606 }
607 void applyAImpulse(const Impulse& impulse) const
608 {
609 if (impulse.m_asVelocity) applyVAImpulse(impulse.m_velocity);
610 if (impulse.m_asDrift) applyDAImpulse(impulse.m_drift);
611 }
612 void applyDCImpulse(const btVector3& impulse) const
613 {
614 if (m_rigid) m_rigid->applyCentralImpulse(impulse);
616 }
617 };
618 /* Joint */
619 struct Joint
620 {
621 struct eType
622 {
623 enum _
624 {
628 };
629 };
630 struct Specs
631 {
632 Specs() : erp(1), cfm(1), split(1) {}
636 };
646 virtual ~Joint() {}
647 Joint() : m_delete(false) {}
648 virtual void Prepare(btScalar dt, int iterations);
649 virtual void Solve(btScalar dt, btScalar sor) = 0;
650 virtual void Terminate(btScalar dt) = 0;
651 virtual eType::_ Type() const = 0;
652 };
653 /* LJoint */
654 struct LJoint : Joint
655 {
657 {
659 };
661 void Prepare(btScalar dt, int iterations);
662 void Solve(btScalar dt, btScalar sor);
663 void Terminate(btScalar dt);
664 eType::_ Type() const { return (eType::Linear); }
665 };
666 /* AJoint */
667 struct AJoint : Joint
668 {
669 struct IControl
670 {
671 virtual ~IControl() {}
672 virtual void Prepare(AJoint*) {}
673 virtual btScalar Speed(AJoint*, btScalar current) { return (current); }
675 {
676 static IControl def;
677 return (&def);
678 }
679 };
688 void Prepare(btScalar dt, int iterations);
689 void Solve(btScalar dt, btScalar sor);
690 void Terminate(btScalar dt);
691 eType::_ Type() const { return (eType::Angular); }
692 };
693 /* CJoint */
694 struct CJoint : Joint
695 {
701 void Prepare(btScalar dt, int iterations);
702 void Solve(btScalar dt, btScalar sor);
703 void Terminate(btScalar dt);
704 eType::_ Type() const { return (eType::Contact); }
705 };
706 /* Config */
707 struct Config
708 {
709 eAeroModel::_ aeromodel; // Aerodynamic model (default: V_Point)
710 btScalar kVCF; // Velocities correction factor (Baumgarte)
711 btScalar kDP; // Damping coefficient [0,1]
712 btScalar kDG; // Drag coefficient [0,+inf]
713 btScalar kLF; // Lift coefficient [0,+inf]
714 btScalar kPR; // Pressure coefficient [-inf,+inf]
715 btScalar kVC; // Volume conversation coefficient [0,+inf]
716 btScalar kDF; // Dynamic friction coefficient [0,1]
717 btScalar kMT; // Pose matching coefficient [0,1]
718 btScalar kCHR; // Rigid contacts hardness [0,1]
719 btScalar kKHR; // Kinetic contacts hardness [0,1]
720 btScalar kSHR; // Soft contacts hardness [0,1]
721 btScalar kAHR; // Anchors hardness [0,1]
722 btScalar kSRHR_CL; // Soft vs rigid hardness [0,1] (cluster only)
723 btScalar kSKHR_CL; // Soft vs kinetic hardness [0,1] (cluster only)
724 btScalar kSSHR_CL; // Soft vs soft hardness [0,1] (cluster only)
725 btScalar kSR_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only)
726 btScalar kSK_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only)
727 btScalar kSS_SPLT_CL; // Soft vs rigid impulse split [0,1] (cluster only)
728 btScalar maxvolume; // Maximum volume ratio for pose
729 btScalar timescale; // Time scale
730 int viterations; // Velocities solver iterations
731 int piterations; // Positions solver iterations
732 int diterations; // Drift solver iterations
733 int citerations; // Cluster solver iterations
734 int collisions; // Collisions flags
735 tVSolverArray m_vsequence; // Velocity solvers sequence
736 tPSolverArray m_psequence; // Position solvers sequence
737 tPSolverArray m_dsequence; // Drift solvers sequence
738 btScalar drag; // deformable air drag
739 btScalar m_maxStress; // Maximum principle first Piola stress
740 };
741 /* SolverState */
743 {
744 //if you add new variables, always initialize them!
746 : sdt(0),
747 isdt(0),
748 velmrg(0),
749 radmrg(0),
750 updmrg(0)
751 {
752 }
753 btScalar sdt; // dt*timescale
754 btScalar isdt; // 1/sdt
755 btScalar velmrg; // velocity margin
756 btScalar radmrg; // radial margin
757 btScalar updmrg; // Update margin
758 };
759
761 {
768 RayFromToCaster(const btVector3& rayFrom, const btVector3& rayTo, btScalar mxt);
769 void Process(const btDbvtNode* leaf);
770
771 static /*inline*/ btScalar rayFromToTriangle(const btVector3& rayFrom,
772 const btVector3& rayTo,
773 const btVector3& rayNormalizedDirection,
774 const btVector3& a,
775 const btVector3& b,
776 const btVector3& c,
777 btScalar maxt = SIMD_INFINITY);
778 };
779
780 //
781 // Typedefs
782 //
783
785 typedef void (*vsolver_t)(btSoftBody*, btScalar);
801
802 //
803 // Fields
804 //
805
806 Config m_cfg; // Configuration
807 SolverState m_sst; // Solver state
808 Pose m_pose; // Pose
809 void* m_tag; // User data
822 tRContactArray m_rcontacts; // Rigid contacts
826 tSContactArray m_scontacts; // Soft contacts
829 btScalar m_timeacc; // Time accumulator
830 btVector3 m_bounds[2]; // Spatial bounds
831 bool m_bUpdateRtCst; // Update runtime constants
832 btDbvt m_ndbvt; // Nodes tree
833 btDbvt m_fdbvt; // Faces tree
834 btDbvntNode* m_fdbvnt; // Faces tree with normals
835 btDbvt m_cdbvt; // Clusters tree
837 btScalar m_dampingCoefficient; // Damping Coefficient
840 btAlignedObjectArray<btVector3> m_quads; // quadrature points for collision detection
845
848 btAlignedObjectArray<btScalar> m_z; // vertical distance used in extrapolation
851
852 btAlignedObjectArray<bool> m_clusterConnectivity; //cluster connectivity, for self-collision
853
855
857
858 //
859 // Api
860 //
861
862 /* ctor */
863 btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btVector3* x, const btScalar* m);
864
865 /* ctor */
867
868 void initDefaults();
869
870 /* dtor */
871 virtual ~btSoftBody();
872 /* Check for existing link */
873
875
877 {
878 return m_worldInfo;
879 }
880
881 void setDampingCoefficient(btScalar damping_coeff)
882 {
883 m_dampingCoefficient = damping_coeff;
884 }
885
887 virtual void setCollisionShape(btCollisionShape* collisionShape)
888 {
889 }
890
891 bool checkLink(int node0,
892 int node1) const;
893 bool checkLink(const Node* node0,
894 const Node* node1) const;
895 /* Check for existring face */
896 bool checkFace(int node0,
897 int node1,
898 int node2) const;
899 /* Append material */
900 Material* appendMaterial();
901 /* Append note */
902 void appendNote(const char* text,
903 const btVector3& o,
904 const btVector4& c = btVector4(1, 0, 0, 0),
905 Node* n0 = 0,
906 Node* n1 = 0,
907 Node* n2 = 0,
908 Node* n3 = 0);
909 void appendNote(const char* text,
910 const btVector3& o,
911 Node* feature);
912 void appendNote(const char* text,
913 const btVector3& o,
914 Link* feature);
915 void appendNote(const char* text,
916 const btVector3& o,
917 Face* feature);
918 /* Append node */
919 void appendNode(const btVector3& x, btScalar m);
920 /* Append link */
921 void appendLink(int model = -1, Material* mat = 0);
922 void appendLink(int node0,
923 int node1,
924 Material* mat = 0,
925 bool bcheckexist = false);
926 void appendLink(Node* node0,
927 Node* node1,
928 Material* mat = 0,
929 bool bcheckexist = false);
930 /* Append face */
931 void appendFace(int model = -1, Material* mat = 0);
932 void appendFace(int node0,
933 int node1,
934 int node2,
935 Material* mat = 0);
936 void appendTetra(int model, Material* mat);
937 //
938 void appendTetra(int node0,
939 int node1,
940 int node2,
941 int node3,
942 Material* mat = 0);
943
944 /* Append anchor */
945 void appendDeformableAnchor(int node, btRigidBody* body);
947 void appendAnchor(int node,
948 btRigidBody* body, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1);
949 void appendAnchor(int node, btRigidBody* body, const btVector3& localPivot, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1);
950 void removeAnchor(int node);
951 /* Append linear joint */
952 void appendLinearJoint(const LJoint::Specs& specs, Cluster* body0, Body body1);
953 void appendLinearJoint(const LJoint::Specs& specs, Body body = Body());
954 void appendLinearJoint(const LJoint::Specs& specs, btSoftBody* body);
955 /* Append linear joint */
956 void appendAngularJoint(const AJoint::Specs& specs, Cluster* body0, Body body1);
957 void appendAngularJoint(const AJoint::Specs& specs, Body body = Body());
958 void appendAngularJoint(const AJoint::Specs& specs, btSoftBody* body);
959 /* Add force (or gravity) to the entire body */
960 void addForce(const btVector3& force);
961 /* Add force (or gravity) to a node of the body */
962 void addForce(const btVector3& force,
963 int node);
964 /* Add aero force to a node of the body */
965 void addAeroForceToNode(const btVector3& windVelocity, int nodeIndex);
966
967 /* Add aero force to a face of the body */
968 void addAeroForceToFace(const btVector3& windVelocity, int faceIndex);
969
970 /* Add velocity to the entire body */
971 void addVelocity(const btVector3& velocity);
972
973 /* Set velocity for the entire body */
974 void setVelocity(const btVector3& velocity);
975
976 /* Add velocity to a node of the body */
977 void addVelocity(const btVector3& velocity,
978 int node);
979 /* Set mass */
980 void setMass(int node,
981 btScalar mass);
982 /* Get mass */
983 btScalar getMass(int node) const;
984 /* Get total mass */
985 btScalar getTotalMass() const;
986 /* Set total mass (weighted by previous masses) */
987 void setTotalMass(btScalar mass,
988 bool fromfaces = false);
989 /* Set total density */
990 void setTotalDensity(btScalar density);
991 /* Set volume mass (using tetrahedrons) */
992 void setVolumeMass(btScalar mass);
993 /* Set volume density (using tetrahedrons) */
994 void setVolumeDensity(btScalar density);
995 /* Get the linear velocity of the center of mass */
997 /* Set the linear velocity of the center of mass */
998 void setLinearVelocity(const btVector3& linVel);
999 /* Set the angular velocity of the center of mass */
1000 void setAngularVelocity(const btVector3& angVel);
1001 /* Get best fit rigid transform */
1003 /* Transform to given pose */
1004 void transformTo(const btTransform& trs);
1005 /* Transform */
1006 void transform(const btTransform& trs);
1007 /* Translate */
1008 void translate(const btVector3& trs);
1009 /* Rotate */
1010 void rotate(const btQuaternion& rot);
1011 /* Scale */
1012 void scale(const btVector3& scl);
1013 /* Get link resting lengths scale */
1015 /* Scale resting length of all springs */
1016 void setRestLengthScale(btScalar restLength);
1017 /* Set current state as pose */
1018 void setPose(bool bvolume,
1019 bool bframe);
1020 /* Set current link lengths as resting lengths */
1021 void resetLinkRestLengths();
1022 /* Return the volume */
1023 btScalar getVolume() const;
1024 /* Cluster count */
1026 {
1027 btVector3 com(0, 0, 0);
1028 for (int i = 0; i < m_nodes.size(); i++)
1029 {
1030 com += (m_nodes[i].m_x * this->getMass(i));
1031 }
1032 com /= this->getTotalMass();
1033 return com;
1034 }
1035 int clusterCount() const;
1036 /* Cluster center of mass */
1037 static btVector3 clusterCom(const Cluster* cluster);
1038 btVector3 clusterCom(int cluster) const;
1039 /* Cluster velocity at rpos */
1040 static btVector3 clusterVelocity(const Cluster* cluster, const btVector3& rpos);
1041 /* Cluster impulse */
1042 static void clusterVImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse);
1043 static void clusterDImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse);
1044 static void clusterImpulse(Cluster* cluster, const btVector3& rpos, const Impulse& impulse);
1045 static void clusterVAImpulse(Cluster* cluster, const btVector3& impulse);
1046 static void clusterDAImpulse(Cluster* cluster, const btVector3& impulse);
1047 static void clusterAImpulse(Cluster* cluster, const Impulse& impulse);
1048 static void clusterDCImpulse(Cluster* cluster, const btVector3& impulse);
1049 /* Generate bending constraints based on distance in the adjency graph */
1050 int generateBendingConstraints(int distance,
1051 Material* mat = 0);
1052 /* Randomize constraints to reduce solver bias */
1053 void randomizeConstraints();
1054 /* Release clusters */
1055 void releaseCluster(int index);
1056 void releaseClusters();
1057 /* Generate clusters (K-mean) */
1060 int generateClusters(int k, int maxiterations = 8192);
1061 /* Refine */
1062 void refine(ImplicitFn* ifn, btScalar accurary, bool cut);
1063 /* CutLink */
1064 bool cutLink(int node0, int node1, btScalar position);
1065 bool cutLink(const Node* node0, const Node* node1, btScalar position);
1066
1068 bool rayTest(const btVector3& rayFrom,
1069 const btVector3& rayTo,
1070 sRayCast& results);
1071 bool rayFaceTest(const btVector3& rayFrom,
1072 const btVector3& rayTo,
1073 sRayCast& results);
1074 int rayFaceTest(const btVector3& rayFrom, const btVector3& rayTo,
1075 btScalar& mint, int& index) const;
1076 /* Solver presets */
1077 void setSolver(eSolverPresets::_ preset);
1078 /* predictMotion */
1079 void predictMotion(btScalar dt);
1080 /* solveConstraints */
1081 void solveConstraints();
1082 /* staticSolve */
1083 void staticSolve(int iterations);
1084 /* solveCommonConstraints */
1085 static void solveCommonConstraints(btSoftBody** bodies, int count, int iterations);
1086 /* solveClusters */
1087 static void solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies);
1088 /* integrateMotion */
1089 void integrateMotion();
1090 /* defaultCollisionHandlers */
1094 bool useSelfCollision();
1095 void updateDeactivation(btScalar timeStep);
1096 void setZeroVelocity();
1097 bool wantsSleeping();
1098
1099 //
1100 // Functionality to deal with new accelerated solvers.
1101 //
1102
1106 void setWindVelocity(const btVector3& velocity);
1107
1111 const btVector3& getWindVelocity();
1112
1113 //
1114 // Set the solver that handles this soft body
1115 // Should not be allowed to get out of sync with reality
1116 // Currently called internally on addition to the world
1118 {
1119 m_softBodySolver = softBodySolver;
1120 }
1121
1122 //
1123 // Return the solver that handles this soft body
1124 //
1129
1130 //
1131 // Return the solver that handles this soft body
1132 //
1134 {
1135 return m_softBodySolver;
1136 }
1137
1138 //
1139 // Cast
1140 //
1141
1142 static const btSoftBody* upcast(const btCollisionObject* colObj)
1143 {
1144 if (colObj->getInternalType() == CO_SOFT_BODY)
1145 return (const btSoftBody*)colObj;
1146 return 0;
1147 }
1149 {
1150 if (colObj->getInternalType() == CO_SOFT_BODY)
1151 return (btSoftBody*)colObj;
1152 return 0;
1153 }
1154
1155 //
1156 // ::btCollisionObject
1157 //
1158
1159 virtual void getAabb(btVector3& aabbMin, btVector3& aabbMax) const
1160 {
1161 aabbMin = m_bounds[0];
1162 aabbMax = m_bounds[1];
1163 }
1164 //
1165 // Private
1166 //
1167 void pointersToIndices();
1168 void indicesToPointers(const int* map = 0);
1169
1170 int rayTest(const btVector3& rayFrom, const btVector3& rayTo,
1171 btScalar& mint, eFeature::_& feature, int& index, bool bcountonly) const;
1172 void initializeFaceTree();
1173 void rebuildNodeTree();
1174 btVector3 evaluateCom() const;
1175 bool checkDeformableContact(const btCollisionObjectWrapper* colObjWrap, const btVector3& x, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const;
1176 bool checkDeformableFaceContact(const btCollisionObjectWrapper* colObjWrap, Face& f, btVector3& contact_point, btVector3& bary, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const;
1177 bool checkContact(const btCollisionObjectWrapper* colObjWrap, const btVector3& x, btScalar margin, btSoftBody::sCti& cti) const;
1178 void updateNormals();
1179 void updateBounds();
1180 void updatePose();
1181 void updateConstants();
1182 void updateLinkConstants();
1183 void updateArea(bool averageArea = true);
1184 void initializeClusters();
1185 void updateClusters();
1186 void cleanupClusters();
1187 void prepareClusters(int iterations);
1188 void solveClusters(btScalar sor);
1189 void applyClusters(bool drift);
1190 void dampClusters();
1192 void setGravityFactor(btScalar gravFactor);
1193 void setCacheBarycenter(bool cacheBarycenter);
1194 void initializeDmInverse();
1195 void updateDeformation();
1196 void advanceDeformation();
1197 void applyForces();
1198 void setMaxStress(btScalar maxStress);
1199 void interpolateRenderMesh();
1200 void setCollisionQuadrature(int N);
1201 static void PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti);
1202 static void PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti);
1203 static void PSolve_SContacts(btSoftBody* psb, btScalar, btScalar ti);
1204 static void PSolve_Links(btSoftBody* psb, btScalar kst, btScalar ti);
1205 static void VSolve_Links(btSoftBody* psb, btScalar kst);
1206 static psolver_t getSolver(ePSolver::_ solver);
1207 static vsolver_t getSolver(eVSolver::_ solver);
1209#define SAFE_EPSILON SIMD_EPSILON * 100.0
1210 void updateNode(btDbvtNode* node, bool use_velocity, bool margin)
1211 {
1212 if (node->isleaf())
1213 {
1214 btSoftBody::Node* n = (btSoftBody::Node*)(node->data);
1216 vol;
1217 btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision
1218 if (use_velocity)
1219 {
1220 btVector3 points[2] = {n->m_x, n->m_x + m_sst.sdt * n->m_v};
1221 vol = btDbvtVolume::FromPoints(points, 2);
1222 vol.Expand(btVector3(pad, pad, pad));
1223 }
1224 else
1225 {
1226 vol = btDbvtVolume::FromCR(n->m_x, pad);
1227 }
1228 node->volume = vol;
1229 return;
1230 }
1231 else
1232 {
1233 updateNode(node->childs[0], use_velocity, margin);
1234 updateNode(node->childs[1], use_velocity, margin);
1236 vol;
1237 Merge(node->childs[0]->volume, node->childs[1]->volume, vol);
1238 node->volume = vol;
1239 }
1240 }
1241
1242 void updateNodeTree(bool use_velocity, bool margin)
1243 {
1244 if (m_ndbvt.m_root)
1245 updateNode(m_ndbvt.m_root, use_velocity, margin);
1246 }
1247
1248 template <class DBVTNODE> // btDbvtNode or btDbvntNode
1249 void updateFace(DBVTNODE* node, bool use_velocity, bool margin)
1250 {
1251 if (node->isleaf())
1252 {
1253 btSoftBody::Face* f = (btSoftBody::Face*)(node->data);
1254 btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision
1256 vol;
1257 if (use_velocity)
1258 {
1259 btVector3 points[6] = {f->m_n[0]->m_x, f->m_n[0]->m_x + m_sst.sdt * f->m_n[0]->m_v,
1260 f->m_n[1]->m_x, f->m_n[1]->m_x + m_sst.sdt * f->m_n[1]->m_v,
1261 f->m_n[2]->m_x, f->m_n[2]->m_x + m_sst.sdt * f->m_n[2]->m_v};
1262 vol = btDbvtVolume::FromPoints(points, 6);
1263 }
1264 else
1265 {
1266 btVector3 points[3] = {f->m_n[0]->m_x,
1267 f->m_n[1]->m_x,
1268 f->m_n[2]->m_x};
1269 vol = btDbvtVolume::FromPoints(points, 3);
1270 }
1271 vol.Expand(btVector3(pad, pad, pad));
1272 node->volume = vol;
1273 return;
1274 }
1275 else
1276 {
1277 updateFace(node->childs[0], use_velocity, margin);
1278 updateFace(node->childs[1], use_velocity, margin);
1280 vol;
1281 Merge(node->childs[0]->volume, node->childs[1]->volume, vol);
1282 node->volume = vol;
1283 }
1284 }
1285 void updateFaceTree(bool use_velocity, bool margin)
1286 {
1287 if (m_fdbvt.m_root)
1288 updateFace(m_fdbvt.m_root, use_velocity, margin);
1289 if (m_fdbvnt)
1290 updateFace(m_fdbvnt, use_velocity, margin);
1291 }
1292
1293 template <typename T>
1294 static inline T BaryEval(const T& a,
1295 const T& b,
1296 const T& c,
1297 const btVector3& coord)
1298 {
1299 return (a * coord.x() + b * coord.y() + c * coord.z());
1300 }
1301
1302 void applyRepulsionForce(btScalar timeStep, bool applySpringForce)
1303 {
1305 {
1306 // randomize the order of repulsive force
1307 indices.resize(m_faceNodeContacts.size());
1308 for (int i = 0; i < m_faceNodeContacts.size(); ++i)
1309 indices[i] = i;
1310#define NEXTRAND (seed = (1664525L * seed + 1013904223L) & 0xffffffff)
1311 int i, ni;
1312
1313 for (i = 0, ni = indices.size(); i < ni; ++i)
1314 {
1315 btSwap(indices[i], indices[NEXTRAND % ni]);
1316 }
1317 }
1318 for (int k = 0; k < m_faceNodeContacts.size(); ++k)
1319 {
1320 int i = indices[k];
1322 btSoftBody::Node* node = c.m_node;
1323 btSoftBody::Face* face = c.m_face;
1324 const btVector3& w = c.m_bary;
1325 const btVector3& n = c.m_normal;
1326 btVector3 l = node->m_x - BaryEval(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, w);
1327 btScalar d = c.m_margin - n.dot(l);
1328 d = btMax(btScalar(0), d);
1329
1330 const btVector3& va = node->m_v;
1331 btVector3 vb = BaryEval(face->m_n[0]->m_v, face->m_n[1]->m_v, face->m_n[2]->m_v, w);
1332 btVector3 vr = va - vb;
1333 const btScalar vn = btDot(vr, n); // dn < 0 <==> opposing
1334 if (vn > OVERLAP_REDUCTION_FACTOR * d / timeStep)
1335 continue;
1336 btVector3 vt = vr - vn * n;
1337 btScalar I = 0;
1338 btScalar mass = node->m_im == 0 ? 0 : btScalar(1) / node->m_im;
1339 if (applySpringForce)
1340 I = -btMin(m_repulsionStiffness * timeStep * d, mass * (OVERLAP_REDUCTION_FACTOR * d / timeStep - vn));
1341 if (vn < 0)
1342 I += 0.5 * mass * vn;
1343 int face_penetration = 0, node_penetration = node->m_constrained;
1344 for (int i = 0; i < 3; ++i)
1345 face_penetration |= face->m_n[i]->m_constrained;
1346 btScalar I_tilde = 2.0 * I / (1.0 + w.length2());
1347
1348 // double the impulse if node or face is constrained.
1349 if (face_penetration > 0 || node_penetration > 0)
1350 {
1351 I_tilde *= 2.0;
1352 }
1353 if (face_penetration <= 0)
1354 {
1355 for (int j = 0; j < 3; ++j)
1356 face->m_n[j]->m_v += w[j] * n * I_tilde * node->m_im;
1357 }
1358 if (node_penetration <= 0)
1359 {
1360 node->m_v -= I_tilde * node->m_im * n;
1361 }
1362
1363 // apply frictional impulse
1364 btScalar vt_norm = vt.safeNorm();
1365 if (vt_norm > SIMD_EPSILON)
1366 {
1367 btScalar delta_vn = -2 * I * node->m_im;
1368 btScalar mu = c.m_friction;
1369 btScalar vt_new = btMax(btScalar(1) - mu * delta_vn / (vt_norm + SIMD_EPSILON), btScalar(0)) * vt_norm;
1370 I = 0.5 * mass * (vt_norm - vt_new);
1371 vt.safeNormalize();
1372 I_tilde = 2.0 * I / (1.0 + w.length2());
1373 // double the impulse if node or face is constrained.
1374 if (face_penetration > 0 || node_penetration > 0)
1375 I_tilde *= 2.0;
1376 if (face_penetration <= 0)
1377 {
1378 for (int j = 0; j < 3; ++j)
1379 face->m_n[j]->m_v += w[j] * vt * I_tilde * (face->m_n[j])->m_im;
1380 }
1381 if (node_penetration <= 0)
1382 {
1383 node->m_v -= I_tilde * node->m_im * vt;
1384 }
1385 }
1386 }
1387 }
1388 virtual int calculateSerializeBufferSize() const;
1389
1391 virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
1392};
1393
1394#endif //_BT_SOFT_BODY_H
btDbvtAabbMm btDbvtVolume
Definition btDbvt.h:177
DBVT_INLINE void Merge(const btDbvtAabbMm &a, const btDbvtAabbMm &b, btDbvtAabbMm &r)
Definition btDbvt.h:745
const T & btMax(const T &a, const T &b)
Definition btMinMax.h:27
const T & btMin(const T &a, const T &b)
Definition btMinMax.h:21
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition btScalar.h:314
#define ATTRIBUTE_ALIGNED16(a)
Definition btScalar.h:99
#define SIMD_INFINITY
Definition btScalar.h:544
#define SIMD_EPSILON
Definition btScalar.h:543
void btSwap(T &a, T &b)
Definition btScalar.h:643
static unsigned long seed
Definition btSoftBody.h:39
static const btScalar OVERLAP_REDUCTION_FACTOR
Definition btSoftBody.h:38
#define NEXTRAND
#define SAFE_EPSILON
btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
Definition btVector3.h:890
btVector3 btCross(const btVector3 &v1, const btVector3 &v2)
Return the cross product of two vectors.
Definition btVector3.h:918
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
int getInternalType() const
reserved for Bullet internal usage
The btCollisionShape class provides an interface for collision shapes that can be shared among btColl...
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
Definition btMatrix3x3.h:50
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
The btRigidBody is the main class for rigid body objects.
Definition btRigidBody.h:60
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
btMultiBodyJacobianData jacobianData_t1
Definition btSoftBody.h:372
btMultiBodyJacobianData jacobianData_normal
Definition btSoftBody.h:371
btMultiBodyJacobianData jacobianData_t2
Definition btSoftBody.h:373
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
Definition btSoftBody.h:75
static void PSolve_Links(btSoftBody *psb, btScalar kst, btScalar ti)
static void PSolve_SContacts(btSoftBody *psb, btScalar, btScalar ti)
bool checkLink(int node0, int node1) const
bool m_bUpdateRtCst
Definition btSoftBody.h:831
btScalar m_sleepingThreshold
Definition btSoftBody.h:838
void transformTo(const btTransform &trs)
btVector3 getLinearVelocity()
bool checkFace(int node0, int node1, int node2) const
void advanceDeformation()
btAlignedObjectArray< eVSolver::_ > tVSolverArray
Definition btSoftBody.h:151
void setGravityFactor(btScalar gravFactor)
void updateClusters()
btDbvt m_cdbvt
Definition btSoftBody.h:835
void setPose(bool bvolume, bool bframe)
btAlignedObjectArray< RenderNode > tRenderNodeArray
Definition btSoftBody.h:789
bool cutLink(int node0, int node1, btScalar position)
void appendFace(int model=-1, Material *mat=0)
void setMass(int node, btScalar mass)
void interpolateRenderMesh()
tJointArray m_joints
Definition btSoftBody.h:827
btScalar m_dampingCoefficient
Definition btSoftBody.h:837
void updateNode(btDbvtNode *node, bool use_velocity, bool margin)
btAlignedObjectArray< TetraScratch > m_tetraScratchesTn
Definition btSoftBody.h:819
void integrateMotion()
btAlignedObjectArray< Tetra > tTetraArray
Definition btSoftBody.h:794
void rebuildNodeTree()
bool rayFaceTest(const btVector3 &rayFrom, const btVector3 &rayTo, sRayCast &results)
void appendLinearJoint(const LJoint::Specs &specs, Cluster *body0, Body body1)
tRenderFaceArray m_renderFaces
Definition btSoftBody.h:816
btAlignedObjectArray< SContact > tSContactArray
Definition btSoftBody.h:797
void scale(const btVector3 &scl)
btAlignedObjectArray< bool > m_clusterConnectivity
Definition btSoftBody.h:852
void updateFaceTree(bool use_velocity, bool margin)
void defaultCollisionHandler(const btCollisionObjectWrapper *pcoWrap)
btScalar getVolume() const
bool rayTest(const btVector3 &rayFrom, const btVector3 &rayTo, sRayCast &results)
Ray casting using rayFrom and rayTo in worldspace, (not direction!)
SolverState m_sst
Definition btSoftBody.h:807
void addVelocity(const btVector3 &velocity)
btAlignedObjectArray< RContact > tRContactArray
Definition btSoftBody.h:796
void setDampingCoefficient(btScalar damping_coeff)
Definition btSoftBody.h:881
void predictMotion(btScalar dt)
void setSelfCollision(bool useSelfCollision)
void setLinearVelocity(const btVector3 &linVel)
btScalar m_timeacc
Definition btSoftBody.h:829
btAlignedObjectArray< int > m_userIndexMapping
Definition btSoftBody.h:874
btAlignedObjectArray< Face > tFaceArray
Definition btSoftBody.h:792
void appendTetra(int model, Material *mat)
void setRestLengthScale(btScalar restLength)
btDbvntNode * m_fdbvnt
Definition btSoftBody.h:834
void updateNodeTree(bool use_velocity, bool margin)
void rotate(const btQuaternion &rot)
void updateFace(DBVTNODE *node, bool use_velocity, bool margin)
void applyClusters(bool drift)
void setZeroVelocity()
static void PSolve_Anchors(btSoftBody *psb, btScalar kst, btScalar ti)
btSoftBodyWorldInfo * m_worldInfo
Definition btSoftBody.h:810
void setSoftBodySolver(btSoftBodySolver *softBodySolver)
void updateArea(bool averageArea=true)
void addForce(const btVector3 &force)
bool wantsSleeping()
void prepareClusters(int iterations)
void setCollisionQuadrature(int N)
static void clusterVImpulse(Cluster *cluster, const btVector3 &rpos, const btVector3 &impulse)
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
btAlignedObjectArray< DeformableFaceNodeContact > m_faceNodeContacts
Definition btSoftBody.h:824
static void VSolve_Links(btSoftBody *psb, btScalar kst)
tTetraArray m_tetras
Definition btSoftBody.h:817
bool useSelfCollision()
btVector3 evaluateCom() const
void setTotalDensity(btScalar density)
btAlignedObjectArray< const class btCollisionObject * > m_collisionDisabledObjects
Definition btSoftBody.h:77
btAlignedObjectArray< Link > tLinkArray
Definition btSoftBody.h:791
static void clusterDAImpulse(Cluster *cluster, const btVector3 &impulse)
void appendNode(const btVector3 &x, btScalar m)
void staticSolve(int iterations)
void setVolumeMass(btScalar mass)
btScalar m_restLengthScale
Definition btSoftBody.h:856
bool checkDeformableContact(const btCollisionObjectWrapper *colObjWrap, const btVector3 &x, btScalar margin, btSoftBody::sCti &cti, bool predict=false) const
void cleanupClusters()
Config m_cfg
Definition btSoftBody.h:806
void updateDeactivation(btScalar timeStep)
btAlignedObjectArray< TetraScratch > m_tetraScratches
Definition btSoftBody.h:818
const btVector3 & getWindVelocity()
Return the wind velocity for interaction with the air.
void addAeroForceToFace(const btVector3 &windVelocity, int faceIndex)
btAlignedObjectArray< btVector4 > m_renderNodesInterpolationWeights
Definition btSoftBody.h:846
void appendAngularJoint(const AJoint::Specs &specs, Cluster *body0, Body body1)
tFaceArray m_faces
Definition btSoftBody.h:815
void setAngularVelocity(const btVector3 &angVel)
void setVolumeDensity(btScalar density)
static void clusterDCImpulse(Cluster *cluster, const btVector3 &impulse)
void transform(const btTransform &trs)
bool m_softSoftCollision
Definition btSoftBody.h:850
static void clusterVAImpulse(Cluster *cluster, const btVector3 &impulse)
btScalar getMass(int node) const
tMaterialArray m_materials
Definition btSoftBody.h:828
void setMaxStress(btScalar maxStress)
void dampClusters()
btSoftBody(btSoftBodyWorldInfo *worldInfo, int node_count, const btVector3 *x, const btScalar *m)
void updateDeformation()
btAlignedObjectArray< btScalar > m_z
Definition btSoftBody.h:848
void addAeroForceToNode(const btVector3 &windVelocity, int nodeIndex)
void applyRepulsionForce(btScalar timeStep, bool applySpringForce)
btAlignedObjectArray< btVector3 > tVector3Array
Definition btSoftBody.h:221
static btVector3 clusterCom(const Cluster *cluster)
tRContactArray m_rcontacts
Definition btSoftBody.h:822
void appendAnchor(int node, btRigidBody *body, bool disableCollisionBetweenLinkedBodies=false, btScalar influence=1)
btAlignedObjectArray< Node > tNodeArray
Definition btSoftBody.h:788
btVector3 m_bounds[2]
Definition btSoftBody.h:830
btScalar m_maxSpeedSquared
Definition btSoftBody.h:839
void releaseCluster(int index)
btScalar m_repulsionStiffness
Definition btSoftBody.h:841
void setVelocity(const btVector3 &velocity)
tClusterArray m_clusters
Definition btSoftBody.h:836
btAlignedObjectArray< Joint * > tJointArray
Definition btSoftBody.h:799
void solveConstraints()
btAlignedObjectArray< DeformableFaceRigidContact > m_faceRigidContacts
Definition btSoftBody.h:825
int generateClusters(int k, int maxiterations=8192)
generateClusters with k=0 will create a convex cluster for each tetrahedron or triangle otherwise an ...
void geometricCollisionHandler(btSoftBody *psb)
void releaseClusters()
void refine(ImplicitFn *ifn, btScalar accurary, bool cut)
void setSolver(eSolverPresets::_ preset)
static T BaryEval(const T &a, const T &b, const T &c, const btVector3 &coord)
Material * appendMaterial()
void removeAnchor(int node)
btAlignedObjectArray< DeformableNodeRigidAnchor > m_deformableAnchors
Definition btSoftBody.h:821
void setCacheBarycenter(bool cacheBarycenter)
btAlignedObjectArray< Material * > tMaterialArray
Definition btSoftBody.h:798
btAlignedObjectArray< Anchor > tAnchorArray
Definition btSoftBody.h:795
btScalar m_gravityFactor
Definition btSoftBody.h:842
static void solveClusters(const btAlignedObjectArray< btSoftBody * > &bodies)
void appendNote(const char *text, const btVector3 &o, const btVector4 &c=btVector4(1, 0, 0, 0), Node *n0=0, Node *n1=0, Node *n2=0, Node *n3=0)
bool checkDeformableFaceContact(const btCollisionObjectWrapper *colObjWrap, Face &f, btVector3 &contact_point, btVector3 &bary, btScalar margin, btSoftBody::sCti &cti, bool predict=false) const
virtual int calculateSerializeBufferSize() const
btAlignedObjectArray< DeformableNodeRigidContact > m_nodeRigidContacts
Definition btSoftBody.h:823
btAlignedObjectArray< btSoftBody * > tSoftBodyArray
Definition btSoftBody.h:800
static void PSolve_RContacts(btSoftBody *psb, btScalar kst, btScalar ti)
static void clusterImpulse(Cluster *cluster, const btVector3 &rpos, const Impulse &impulse)
btAlignedObjectArray< btAlignedObjectArray< const btSoftBody::Node * > > m_renderNodesParents
Definition btSoftBody.h:847
tRenderNodeArray m_renderNodes
Definition btSoftBody.h:813
void pointersToIndices()
tNoteArray m_notes
Definition btSoftBody.h:811
void updateNormals()
static void clusterDImpulse(Cluster *cluster, const btVector3 &rpos, const btVector3 &impulse)
btDbvt m_fdbvt
Definition btSoftBody.h:833
tLinkArray m_links
Definition btSoftBody.h:814
void applyForces()
static btVector3 clusterVelocity(const Cluster *cluster, const btVector3 &rpos)
btTransform getRigidTransform()
tSContactArray m_scontacts
Definition btSoftBody.h:826
bool m_cacheBarycenter
Definition btSoftBody.h:843
bool m_useSelfCollision
Definition btSoftBody.h:849
void * m_tag
Definition btSoftBody.h:809
void updatePose()
btAlignedObjectArray< btDbvtNode * > tLeafArray
Definition btSoftBody.h:790
void(* psolver_t)(btSoftBody *, btScalar, btScalar)
Definition btSoftBody.h:784
void initializeClusters()
btSoftBodyWorldInfo * getWorldInfo()
Definition btSoftBody.h:876
tAnchorArray m_anchors
Definition btSoftBody.h:820
btScalar getRestLengthScale()
btAlignedObjectArray< Note > tNoteArray
Definition btSoftBody.h:787
void randomizeConstraints()
virtual void setCollisionShape(btCollisionShape *collisionShape)
Definition btSoftBody.h:887
btVector3 m_windVelocity
Definition btSoftBody.h:854
btScalar getTotalMass() const
tNodeArray m_nodes
Definition btSoftBody.h:812
btAlignedObjectArray< ePSolver::_ > tPSolverArray
Definition btSoftBody.h:152
void appendLink(int model=-1, Material *mat=0)
void setSpringStiffness(btScalar k)
void initializeDmInverse()
static const btSoftBody * upcast(const btCollisionObject *colObj)
void updateConstants()
void setTotalMass(btScalar mass, bool fromfaces=false)
btSoftBodySolver * getSoftBodySolver()
virtual ~btSoftBody()
void appendDeformableAnchor(int node, btRigidBody *body)
btAlignedObjectArray< RenderFace > tRenderFaceArray
Definition btSoftBody.h:793
void updateLinkConstants()
virtual void getAabb(btVector3 &aabbMin, btVector3 &aabbMax) const
void(* vsolver_t)(btSoftBody *, btScalar)
Definition btSoftBody.h:785
void initDefaults()
btAlignedObjectArray< btVector3 > m_quads
Definition btSoftBody.h:840
static psolver_t getSolver(ePSolver::_ solver)
bool checkContact(const btCollisionObjectWrapper *colObjWrap, const btVector3 &x, btScalar margin, btSoftBody::sCti &cti) const
void indicesToPointers(const int *map=0)
static void solveCommonConstraints(btSoftBody **bodies, int count, int iterations)
btAlignedObjectArray< Cluster * > tClusterArray
Definition btSoftBody.h:786
void updateBounds()
void setWindVelocity(const btVector3 &velocity)
Set a wind velocity for interaction with the air.
btSoftBodySolver * getSoftBodySolver() const
int generateBendingConstraints(int distance, Material *mat=0)
btAlignedObjectArray< btVector3 > m_X
Definition btSoftBody.h:844
void translate(const btVector3 &trs)
btVector3 getCenterOfMass() const
void initializeFaceTree()
btSoftBodySolver * m_softBodySolver
Definition btSoftBody.h:80
void resetLinkRestLengths()
int clusterCount() const
btAlignedObjectArray< btScalar > tScalarArray
Definition btSoftBody.h:220
btDbvt m_ndbvt
Definition btSoftBody.h:832
static void clusterAImpulse(Cluster *cluster, const Impulse &impulse)
static btSoftBody * upcast(btCollisionObject *colObj)
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition btTransform.h:30
static const btTransform & getIdentity()
Return an identity transform.
btVector3 can be used to represent 3D points and vectors.
Definition btVector3.h:82
btScalar safeNorm() const
Return the norm (length) of the vector.
Definition btVector3.h:269
const btScalar & z() const
Return the z value.
Definition btVector3.h:579
btVector3 & safeNormalize()
Definition btVector3.h:286
btScalar dot(const btVector3 &v) const
Return the dot product.
Definition btVector3.h:229
btScalar length2() const
Return the length of the vector squared.
Definition btVector3.h:251
const btScalar & x() const
Return the x value.
Definition btVector3.h:575
const btScalar & y() const
Return the y value.
Definition btVector3.h:577
static btDbvtAabbMm FromCR(const btVector3 &c, btScalar r)
Definition btDbvt.h:473
static btDbvtAabbMm FromPoints(const btVector3 *pts, int n)
Definition btDbvt.h:488
btDbvtNode * childs[2]
Definition btDbvt.h:187
void * data
Definition btDbvt.h:188
btDbvtVolume volume
Definition btDbvt.h:182
DBVT_INLINE bool isleaf() const
Definition btDbvt.h:184
The btDbvt class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes ...
Definition btDbvt.h:229
btDispatcher * m_dispatcher
Definition btSoftBody.h:55
btScalar water_density
Definition btSoftBody.h:50
btSparseSdf< 3 > m_sparsesdf
Definition btSoftBody.h:57
btVector3 m_gravity
Definition btSoftBody.h:56
btVector3 water_normal
Definition btSoftBody.h:53
btScalar m_maxDisplacement
Definition btSoftBody.h:52
btScalar water_offset
Definition btSoftBody.h:51
btBroadphaseInterface * m_broadphase
Definition btSoftBody.h:54
static IControl * Default()
Definition btSoftBody.h:674
virtual btScalar Speed(AJoint *, btScalar current)
Definition btSoftBody.h:673
virtual void Prepare(AJoint *)
Definition btSoftBody.h:672
btVector3 m_axis[2]
Definition btSoftBody.h:686
void Prepare(btScalar dt, int iterations)
void Solve(btScalar dt, btScalar sor)
IControl * m_icontrol
Definition btSoftBody.h:687
void Terminate(btScalar dt)
eType::_ Type() const
Definition btSoftBody.h:691
btRigidBody * m_body
Definition btSoftBody.h:428
btMatrix3x3 m_c0
Definition btSoftBody.h:430
btScalar invMass() const
Definition btSoftBody.h:539
Body(Cluster *p)
Definition btSoftBody.h:519
const btMatrix3x3 & invWorldInertia() const
Definition btSoftBody.h:532
void applyVImpulse(const btVector3 &impulse, const btVector3 &rpos) const
Definition btSoftBody.h:574
btVector3 angularVelocity() const
Definition btSoftBody.h:564
btRigidBody * m_rigid
Definition btSoftBody.h:515
btVector3 linearVelocity() const
Definition btSoftBody.h:552
btVector3 angularVelocity(const btVector3 &rpos) const
Definition btSoftBody.h:558
void applyDImpulse(const btVector3 &impulse, const btVector3 &rpos) const
Definition btSoftBody.h:579
Body(const btCollisionObject *colObj)
Definition btSoftBody.h:520
btVector3 velocity(const btVector3 &rpos) const
Definition btSoftBody.h:570
void applyDCImpulse(const btVector3 &impulse) const
Definition btSoftBody.h:612
void applyDAImpulse(const btVector3 &impulse) const
Definition btSoftBody.h:602
const btTransform & xform() const
Definition btSoftBody.h:545
void activate() const
Definition btSoftBody.h:525
void applyVAImpulse(const btVector3 &impulse) const
Definition btSoftBody.h:597
Cluster * m_soft
Definition btSoftBody.h:514
void applyAImpulse(const Impulse &impulse) const
Definition btSoftBody.h:607
void applyImpulse(const Impulse &impulse, const btVector3 &rpos) const
Definition btSoftBody.h:584
const btCollisionObject * m_collisionObject
Definition btSoftBody.h:516
void Terminate(btScalar dt)
eType::_ Type() const
Definition btSoftBody.h:704
btVector3 m_rpos[2]
Definition btSoftBody.h:698
void Prepare(btScalar dt, int iterations)
void Solve(btScalar dt, btScalar sor)
btVector3 m_dimpulses[2]
Definition btSoftBody.h:469
tVector3Array m_framerefs
Definition btSoftBody.h:461
btMatrix3x3 m_invwi
Definition btSoftBody.h:466
btScalar m_maxSelfCollisionImpulse
Definition btSoftBody.h:479
btMatrix3x3 m_locii
Definition btSoftBody.h:465
btAlignedObjectArray< Node * > m_nodes
Definition btSoftBody.h:460
btDbvtNode * m_leaf
Definition btSoftBody.h:474
btVector3 m_vimpulses[2]
Definition btSoftBody.h:468
tScalarArray m_masses
Definition btSoftBody.h:459
btScalar m_selfCollisionImpulseFactor
Definition btSoftBody.h:480
btTransform m_framexform
Definition btSoftBody.h:462
tPSolverArray m_psequence
Definition btSoftBody.h:736
tPSolverArray m_dsequence
Definition btSoftBody.h:737
eAeroModel::_ aeromodel
Definition btSoftBody.h:709
tVSolverArray m_vsequence
Definition btSoftBody.h:735
btVector4 m_pcontact
Definition btSoftBody.h:311
btVector3 m_normal
Definition btSoftBody.h:308
btDbvtNode * m_leaf
Definition btSoftBody.h:310
Material * m_material
Definition btSoftBody.h:258
virtual btScalar Eval(const btVector3 &x)=0
Impulse operator*(btScalar x) const
Definition btSoftBody.h:503
Impulse operator-() const
Definition btSoftBody.h:496
btVector3 m_drift
Definition btSoftBody.h:642
btVector3 m_sdrift
Definition btSoftBody.h:643
virtual void Solve(btScalar dt, btScalar sor)=0
virtual void Terminate(btScalar dt)=0
btMatrix3x3 m_massmatrix
Definition btSoftBody.h:644
btVector3 m_refs[2]
Definition btSoftBody.h:638
virtual void Prepare(btScalar dt, int iterations)
virtual eType::_ Type() const =0
void Solve(btScalar dt, btScalar sor)
btVector3 m_rpos[2]
Definition btSoftBody.h:660
eType::_ Type() const
Definition btSoftBody.h:664
void Prepare(btScalar dt, int iterations)
void Terminate(btScalar dt)
btVector3 m_splitv
Definition btSoftBody.h:281
btDbvtNode * m_leaf
Definition btSoftBody.h:277
btMatrix3x3 m_effectiveMass_inv
Definition btSoftBody.h:283
btMatrix3x3 m_effectiveMass
Definition btSoftBody.h:282
btScalar m_coords[4]
Definition btSoftBody.h:441
btVector3 m_offset
Definition btSoftBody.h:438
Node * m_nodes[4]
Definition btSoftBody.h:440
const char * m_text
Definition btSoftBody.h:437
btMatrix3x3 m_scl
Definition btSoftBody.h:453
btScalar m_volume
Definition btSoftBody.h:448
btVector3 m_com
Definition btSoftBody.h:451
tVector3Array m_pos
Definition btSoftBody.h:449
btMatrix3x3 m_aqq
Definition btSoftBody.h:454
btMatrix3x3 m_rot
Definition btSoftBody.h:452
tScalarArray m_wgh
Definition btSoftBody.h:450
btMultiBodyJacobianData jacobianData_t2
Definition btSoftBody.h:354
btMultiBodyJacobianData jacobianData_t1
Definition btSoftBody.h:353
btMultiBodyJacobianData jacobianData_normal
Definition btSoftBody.h:352
RayFromToCaster(const btVector3 &rayFrom, const btVector3 &rayTo, btScalar mxt)
void Process(const btDbvtNode *leaf)
static btScalar rayFromToTriangle(const btVector3 &rayFrom, const btVector3 &rayTo, const btVector3 &rayNormalizedDirection, const btVector3 &a, const btVector3 &b, const btVector3 &c, btScalar maxt=SIMD_INFINITY)
RenderNode * m_n[3]
Definition btSoftBody.h:301
btScalar m_element_measure
Definition btSoftBody.h:326
btMatrix3x3 m_Dm_inverse
Definition btSoftBody.h:324
btMatrix3x3 m_F
Definition btSoftBody.h:325
btVector4 m_P_inv[3]
Definition btSoftBody.h:327
btVector3 m_c0[4]
Definition btSoftBody.h:321
btDbvtNode * m_leaf
Definition btSoftBody.h:320
@ V_TwoSided
Vertex normals are oriented toward velocity.
Definition btSoftBody.h:92
@ V_OneSided
Vertex normals are flipped to match velocity and lift and drag forces are applied.
Definition btSoftBody.h:94
@ END
Face normals are taken as it is.
Definition btSoftBody.h:98
@ V_TwoSidedLiftDrag
Vertex normals are flipped to match velocity.
Definition btSoftBody.h:93
@ F_OneSided
Face normals are flipped to match velocity and lift and drag forces are applied.
Definition btSoftBody.h:97
@ F_TwoSided
Vertex normals are taken as it is.
Definition btSoftBody.h:95
@ F_TwoSidedLiftDrag
Face normals are flipped to match velocity.
Definition btSoftBody.h:96
ePSolver : positions solvers
Definition btSoftBody.h:114
@ RContacts
Anchor solver.
Definition btSoftBody.h:119
@ SContacts
Rigid contacts solver.
Definition btSoftBody.h:120
@ Anchors
Linear solver.
Definition btSoftBody.h:118
@ END
Soft contacts solver.
Definition btSoftBody.h:121
eVSolver : velocities solvers
Definition btSoftBody.h:104
@ END
Linear solver.
Definition btSoftBody.h:108
@ SDF_RDN
GJK based Multibody vs. deformable face.
Definition btSoftBody.h:177
@ VF_SS
Rigid versus soft mask.
Definition btSoftBody.h:169
@ Default
SDF based Rigid vs. deformable node.
Definition btSoftBody.h:179
@ RVDFmask
Vertex vs face soft vs soft handling.
Definition btSoftBody.h:174
@ VF_DD
Cluster soft body self collision.
Definition btSoftBody.h:172
@ CL_SS
Vertex vs face soft vs soft handling.
Definition btSoftBody.h:170
@ CL_SELF
Cluster vs cluster soft vs soft handling.
Definition btSoftBody.h:171
@ SVSmask
rigid vs deformable
Definition btSoftBody.h:168
@ SDF_RS
Rigid versus soft mask.
Definition btSoftBody.h:164
@ SDF_RD
Cluster vs convex rigid vs soft.
Definition btSoftBody.h:166
@ SDF_RDF
Rigid versus deformable face mask.
Definition btSoftBody.h:175
@ SDF_MDF
GJK based Rigid vs. deformable face.
Definition btSoftBody.h:176
@ CL_RS
SDF based rigid vs soft.
Definition btSoftBody.h:165
@ Default
Enable debug draw.
Definition btSoftBody.h:191
const btCollisionObject * m_colObj
Definition btSoftBody.h:226
btVector3 m_bary
Definition btSoftBody.h:229
btScalar m_offset
Definition btSoftBody.h:228
btVector3 m_normal
Definition btSoftBody.h:227
eFeature::_ feature
soft body
Definition btSoftBody.h:204
btScalar fraction
feature index
Definition btSoftBody.h:206
int index
feature type
Definition btSoftBody.h:205
btSoftBody * body
Definition btSoftBody.h:203