16#ifndef BT_MOUSE_PICKING_FORCE_H
17#define BT_MOUSE_PICKING_FORCE_H
25 btScalar m_elasticStiffness, m_dampingStiffness;
27 btVector3 m_mouse_pos;
49 for (
int i = 0; i < 3; ++i)
51 btVector3 v_diff = m_face.
m_n[i]->
m_v;
52 btVector3 scaled_force = scale * m_dampingStiffness * v_diff;
56 scaled_force = scale * m_dampingStiffness * v_diff.dot(dir) * dir;
58 force[m_face.
m_n[i]->
index] -= scaled_force;
64 btScalar scaled_stiffness = scale * m_elasticStiffness;
65 for (
int i = 0; i < 3; ++i)
67 btVector3 dir = (m_face.
m_n[i]->
m_q - m_mouse_pos);
68 btVector3 scaled_force = scaled_stiffness * dir;
69 if (scaled_force.safeNorm() > m_maxForce)
71 scaled_force.safeNormalize();
72 scaled_force *= m_maxForce;
74 force[m_face.
m_n[i]->
index] -= scaled_force;
80 btScalar scaled_k_damp = m_dampingStiffness * scale;
81 for (
int i = 0; i < 3; ++i)
83 btVector3 local_scaled_df = scaled_k_damp * dv[m_face.
m_n[i]->
index];
87 local_scaled_df = scaled_k_damp * dv[m_face.
m_n[i]->
index].dot(dir) * dir;
89 df[m_face.
m_n[i]->
index] -= local_scaled_df;
98 for (
int i = 0; i < 3; ++i)
100 btVector3 dir = (m_face.
m_n[i]->
m_q - m_mouse_pos);
101 btVector3 scaled_force = m_elasticStiffness * dir;
102 if (scaled_force.safeNorm() > m_maxForce)
104 scaled_force.safeNormalize();
105 scaled_force *= m_maxForce;
107 energy += 0.5 * scaled_force.dot(dir);
115 for (
int i = 0; i < 3; ++i)
117 btVector3 v_diff = m_face.
m_n[i]->
m_v;
118 btVector3 scaled_force = m_dampingStiffness * v_diff;
122 scaled_force = m_dampingStiffness * v_diff.dot(dir) * dir;
124 energy -= scaled_force.dot(m_face.
m_n[i]->
m_v) / dt;
131 btScalar scaled_stiffness = scale * m_elasticStiffness;
132 for (
int i = 0; i < 3; ++i)
134 btVector3 dir = (m_face.
m_n[i]->
m_q - m_mouse_pos);
138 btVector3 dx_diff = dx[id];
140 btVector3 scaled_df =
btVector3(0, 0, 0);
143 scaled_df -= scaled_stiffness * dir_normalized.dot(dx_diff) * dir_normalized;
144 scaled_df += scaled_stiffness * dir_normalized.dot(dx_diff) * ((dir_norm - r) / dir_norm) * dir_normalized;
145 scaled_df -= scaled_stiffness * ((dir_norm - r) / dir_norm) * dx_diff;
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.