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)
92 const Matrix3d &
rot =
m_segment->GlobalTransform().linear();
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();
153 const IK_QSegment *seg;
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++) {
170 axis *= m_total_mass_inv;
172 if (
segment->Translational()) {
176 Vector3d pa = axis.cross(p);
181 const IK_QSegment *seg;
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;
205 JacobianSegment(jacobian, center,
m_segment);
ATTR_WARN_UNUSED_RESULT const size_t num
static bool FuzzyZero(double x)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void ComputeJacobian(IK_QJacobian &jacobian) override
double Distance() const override
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) override
void ComputeJacobian(IK_QJacobian &jacobian) override
double Distance() const override
IK_QPositionTask(bool primary, const IK_QSegment *segment, const Vector3d &goal)
bool Translational() const
IK_QSegment * Parent() const
virtual Vector3d Axis(int dof) const =0
Vector3d GlobalStart() const
IK_QSegment * Sibling() const
double MaxExtension() const
const IK_QSegment * m_segment
IK_QTask(int size, bool primary, bool active, const IK_QSegment *segment)
float length(VecOp< float, D >) RET
Segment< FEdge *, Vec3r > segment