14 : m_size(size), m_primary(primary), m_active(active), m_segment(segment), m_weight(1.0)
35 m_clamp_length /= 2 * num;
43 Vector3d d_pos = m_goal -
pos;
44 double length = d_pos.norm();
46 if (length > m_clamp_length) {
47 d_pos = (m_clamp_length /
length) * d_pos;
66 Vector3d pa = p.cross(axis);
76 Vector3d d_pos = m_goal -
pos;
85 :
IK_QTask(3, primary,
true, segment), m_goal(goal), m_distance(0.0)
94 Matrix3d d_rotm = (m_goal *
rot.transpose()).
transpose();
97 d_rot = -0.5 * Vector3d(d_rotm(2, 1) - d_rotm(1, 2),
98 d_rotm(0, 2) - d_rotm(2, 0),
99 d_rotm(1, 0) - d_rotm(0, 1));
101 m_distance = d_rot.norm();
128 const Vector3d &goal_center)
129 :
IK_QTask(3, primary,
true, segment), m_goal_center(goal_center)
131 m_total_mass_inv = ComputeTotalMass(
m_segment);
133 m_total_mass_inv = 1.0 / m_total_mass_inv;
137double IK_QCenterOfMassTask::ComputeTotalMass(
const IK_QSegment *segment)
142 for (seg = segment->Child(); seg; seg = seg->
Sibling()) {
143 mass += ComputeTotalMass(seg);
149Vector3d IK_QCenterOfMassTask::ComputeCenter(
const IK_QSegment *segment)
151 Vector3d center = segment->GlobalStart();
154 for (seg = segment->Child(); seg; seg = seg->
Sibling()) {
155 center += ComputeCenter(seg);
161void IK_QCenterOfMassTask::JacobianSegment(
IK_QJacobian &jacobian,
166 Vector3d p = center - segment->GlobalStart();
168 for (i = 0; i < segment->NumberOfDoF(); i++) {
169 Vector3d axis = segment->Axis(i) *
m_weight;
170 axis *= m_total_mass_inv;
172 if (segment->Translational()) {
176 Vector3d pa = axis.cross(p);
182 for (seg = segment->Child(); seg; seg = seg->
Sibling()) {
183 JacobianSegment(jacobian, center, seg);
189 Vector3d center = ComputeCenter(
m_segment) * m_total_mass_inv;
192 Vector3d d_pos = m_goal_center - center;
194 m_distance = d_pos.norm();
197 if (m_distance > m_clamp_length)
198 d_pos = (m_clamp_length / m_distance) * d_pos;
204 JacobianSegment(jacobian, center,
m_segment);
static bool FuzzyZero(double x)
btMatrix3x3 transpose() const
Return the transpose of the matrix.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
void ComputeJacobian(IK_QJacobian &jacobian)
IK_QCenterOfMassTask(bool primary, const IK_QSegment *segment, const Vector3d ¢er)
void SetDerivatives(int id, int dof_id, const Vector3d &v, double norm_weight)
void SetBetas(int id, int size, const Vector3d &v)
IK_QOrientationTask(bool primary, const IK_QSegment *segment, const Matrix3d &goal)
void ComputeJacobian(IK_QJacobian &jacobian)
void ComputeJacobian(IK_QJacobian &jacobian)
IK_QPositionTask(bool primary, const IK_QSegment *segment, const Vector3d &goal)
const Vector3d GlobalStart() const
const Affine3d & GlobalTransform() const
const Vector3d GlobalEnd() const
bool Translational() const
IK_QSegment * Parent() const
const double MaxExtension() const
virtual Vector3d Axis(int dof) const =0
IK_QSegment * Sibling() const
const IK_QSegment * m_segment
IK_QTask(int size, bool primary, bool active, const IK_QSegment *segment)