16#ifndef BT_MASS_SPRING_H
17#define BT_MASS_SPRING_H
25 bool m_momentum_conserving;
26 btScalar m_elasticStiffness, m_dampingStiffness, m_bendingStiffness;
33 btDeformableMassSpringForce(
btScalar k,
btScalar d,
bool conserve_angular =
true,
double bending_k = -1) : m_momentum_conserving(conserve_angular), m_elasticStiffness(k), m_dampingStiffness(d), m_bendingStiffness(bending_k)
35 if (m_bendingStiffness <
btScalar(0))
37 m_bendingStiffness = m_elasticStiffness;
65 const btSoftBody::Link& link = psb->
m_links[j];
68 size_t id1 = node1->
index;
69 size_t id2 = node2->
index;
72 btVector3 v_diff = (node2->
m_v - node1->
m_v);
73 btVector3 scaled_force = scale * m_dampingStiffness * v_diff;
74 if (m_momentum_conserving)
79 scaled_force = scale * m_dampingStiffness * v_diff.dot(dir) * dir;
82 force[id1] += scaled_force;
83 force[id2] -= scaled_force;
101 const btSoftBody::Link& link = psb->
m_links[j];
105 size_t id1 = node1->
index;
106 size_t id2 = node2->
index;
109 btVector3 dir = (node2->
m_q - node1->
m_q);
111 btScalar scaled_stiffness = scale * (link.m_bbending ? m_bendingStiffness : m_elasticStiffness);
112 btVector3 scaled_force = scaled_stiffness * (dir - dir_normalized * r);
113 force[id1] += scaled_force;
114 force[id2] -= scaled_force;
125 if (!psb->isActive())
129 btScalar scaled_k_damp = m_dampingStiffness * scale;
132 const btSoftBody::Link& link = psb->
m_links[j];
135 size_t id1 = node1->
index;
136 size_t id2 = node2->
index;
138 btVector3 local_scaled_df = scaled_k_damp * (dv[id2] - dv[id1]);
139 if (m_momentum_conserving)
144 local_scaled_df = scaled_k_damp * (dv[id2] - dv[id1]).
dot(dir) * dir;
147 df[id1] += local_scaled_df;
148 df[id2] -= local_scaled_df;
159 if (!psb->isActive())
163 btScalar scaled_k_damp = m_dampingStiffness * scale;
166 const btSoftBody::Link& link = psb->
m_links[j];
169 size_t id1 = node1->
index;
170 size_t id2 = node2->
index;
171 if (m_momentum_conserving)
176 for (
int d = 0; d < 3; ++d)
179 diagA[id1][d] -= scaled_k_damp * dir[d] * dir[d];
181 diagA[id2][d] -= scaled_k_damp * dir[d] * dir[d];
187 for (
int d = 0; d < 3; ++d)
190 diagA[id1][d] -= scaled_k_damp;
192 diagA[id2][d] -= scaled_k_damp;
205 if (!psb->isActive())
211 const btSoftBody::Link& link = psb->
m_links[j];
217 btVector3 dir = (node2->
m_q - node1->
m_q);
218 energy += 0.5 * m_elasticStiffness * (dir.norm() - r) * (dir.norm() - r);
231 if (!psb->isActive())
241 dampingForce.
resize(sz + 1);
242 for (
int i = 0; i < dampingForce.
size(); ++i)
251 energy -= dampingForce[node.index].dot(node.m_v) / dt;
263 if (!psb->isActive())
269 const btSoftBody::Link& link = psb->
m_links[j];
272 size_t id1 = node1->
index;
273 size_t id2 = node2->
index;
276 btVector3 dir = (node1->
m_q - node2->
m_q);
279 btVector3 dx_diff = dx[id1] - dx[id2];
280 btVector3 scaled_df =
btVector3(0, 0, 0);
281 btScalar scaled_k = scale * (link.m_bbending ? m_bendingStiffness : m_elasticStiffness);
284 scaled_df -= scaled_k * dir_normalized.dot(dx_diff) * dir_normalized;
285 scaled_df += scaled_k * dir_normalized.dot(dx_diff) * ((dir_norm - r) / dir_norm) * dir_normalized;
286 scaled_df -= scaled_k * ((dir_norm - r) / dir_norm) * dx_diff;
289 df[id1] += scaled_df;
290 df[id2] -= scaled_df;
void setZero()
Set the matrix to the identity.
SIMD_FORCE_INLINE const T & btMax(const T &a, const T &b)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE btVector3 normalized() const
Return a normalized version of this vector.
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"