Blender V4.3
IK_QTask.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include "IK_Math.h"
12#include "IK_QJacobian.h"
13#include "IK_QSegment.h"
14
15class IK_QTask {
16 public:
17 IK_QTask(int size, bool primary, bool active, const IK_QSegment *segment);
18 virtual ~IK_QTask() {}
19
20 int Id() const
21 {
22 return m_size;
23 }
24
25 void SetId(int id)
26 {
27 m_id = id;
28 }
29
30 int Size() const
31 {
32 return m_size;
33 }
34
35 bool Primary() const
36 {
37 return m_primary;
38 }
39
40 bool Active() const
41 {
42 return m_active;
43 }
44
45 double Weight() const
46 {
47 return m_weight * m_weight;
48 }
49
50 void SetWeight(double weight)
51 {
52 m_weight = sqrt(weight);
53 }
54
55 virtual void ComputeJacobian(IK_QJacobian &jacobian) = 0;
56
57 virtual double Distance() const = 0;
58
59 virtual bool PositionTask() const
60 {
61 return false;
62 }
63
64 virtual void Scale(double) {}
65
66 protected:
67 int m_id;
68 int m_size;
72 double m_weight;
73};
74
75class IK_QPositionTask : public IK_QTask {
76 public:
77 IK_QPositionTask(bool primary, const IK_QSegment *segment, const Vector3d &goal);
78
79 void ComputeJacobian(IK_QJacobian &jacobian);
80
81 double Distance() const;
82
83 bool PositionTask() const
84 {
85 return true;
86 }
87 void Scale(double scale)
88 {
89 m_goal *= scale;
90 m_clamp_length *= scale;
91 }
92
93 private:
94 Vector3d m_goal;
95 double m_clamp_length;
96};
97
99 public:
100 IK_QOrientationTask(bool primary, const IK_QSegment *segment, const Matrix3d &goal);
101
102 double Distance() const
103 {
104 return m_distance;
105 }
106 void ComputeJacobian(IK_QJacobian &jacobian);
107
108 private:
109 Matrix3d m_goal;
110 double m_distance;
111};
112
114 public:
115 IK_QCenterOfMassTask(bool primary, const IK_QSegment *segment, const Vector3d &center);
116
117 void ComputeJacobian(IK_QJacobian &jacobian);
118
119 double Distance() const;
120
121 void Scale(double scale)
122 {
123 m_goal_center *= scale;
124 m_distance *= scale;
125 }
126
127 private:
128 double ComputeTotalMass(const IK_QSegment *segment);
129 Vector3d ComputeCenter(const IK_QSegment *segment);
130 void JacobianSegment(IK_QJacobian &jacobian, Vector3d &center, const IK_QSegment *segment);
131
132 Vector3d m_goal_center;
133 double m_total_mass_inv;
134 double m_distance;
135};
sqrt(x)+1/max(0
void Scale(double scale)
Definition IK_QTask.h:121
void ComputeJacobian(IK_QJacobian &jacobian)
Definition IK_QTask.cpp:187
IK_QCenterOfMassTask(bool primary, const IK_QSegment *segment, const Vector3d &center)
Definition IK_QTask.cpp:126
double Distance() const
Definition IK_QTask.cpp:207
IK_QOrientationTask(bool primary, const IK_QSegment *segment, const Matrix3d &goal)
Definition IK_QTask.cpp:82
double Distance() const
Definition IK_QTask.h:102
void ComputeJacobian(IK_QJacobian &jacobian)
Definition IK_QTask.cpp:89
void ComputeJacobian(IK_QJacobian &jacobian)
Definition IK_QTask.cpp:38
void Scale(double scale)
Definition IK_QTask.h:87
double Distance() const
Definition IK_QTask.cpp:73
IK_QPositionTask(bool primary, const IK_QSegment *segment, const Vector3d &goal)
Definition IK_QTask.cpp:20
bool PositionTask() const
Definition IK_QTask.h:83
void SetId(int id)
Definition IK_QTask.h:25
bool Active() const
Definition IK_QTask.h:40
const IK_QSegment * m_segment
Definition IK_QTask.h:71
void SetWeight(double weight)
Definition IK_QTask.h:50
virtual void ComputeJacobian(IK_QJacobian &jacobian)=0
double Weight() const
Definition IK_QTask.h:45
double m_weight
Definition IK_QTask.h:72
bool Primary() const
Definition IK_QTask.h:35
virtual ~IK_QTask()
Definition IK_QTask.h:18
bool m_active
Definition IK_QTask.h:70
virtual double Distance() const =0
bool m_primary
Definition IK_QTask.h:69
virtual bool PositionTask() const
Definition IK_QTask.h:59
int Id() const
Definition IK_QTask.h:20
int m_size
Definition IK_QTask.h:68
virtual void Scale(double)
Definition IK_QTask.h:64
int m_id
Definition IK_QTask.h:67
int Size() const
Definition IK_QTask.h:30
IK_QTask(int size, bool primary, bool active, const IK_QSegment *segment)
Definition IK_QTask.cpp:13