mirror of
https://github.com/okalachev/flix.git
synced 2025-08-17 00:56:11 +00:00
Add getRoll, getPitch, setRoll, setPitch methods
Add methods to Quaternion for consistency with getYaw and setYaw
This commit is contained in:
@@ -116,29 +116,31 @@ public:
|
|||||||
return euler;
|
return euler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float getRoll() const {
|
||||||
|
return toEuler().x;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getPitch() const {
|
||||||
|
return toEuler().y;
|
||||||
|
}
|
||||||
|
|
||||||
float getYaw() const {
|
float getYaw() const {
|
||||||
// https://github.com/ros/geometry2/blob/589caf083cae9d8fae7effdb910454b4681b9ec1/tf2/include/tf2/impl/utils.h#L122
|
return toEuler().z;
|
||||||
float yaw;
|
}
|
||||||
float sqx = x * x;
|
|
||||||
float sqy = y * y;
|
void setRoll(float roll) {
|
||||||
float sqz = z * z;
|
Vector euler = toEuler();
|
||||||
float sqw = w * w;
|
*this = Quaternion::fromEuler(Vector(roll, euler.y, euler.z));
|
||||||
double sarg = -2 * (x * z - w * y) / (sqx + sqy + sqz + sqw);
|
}
|
||||||
if (sarg <= -0.99999) {
|
|
||||||
yaw = -2 * atan2(y, x);
|
void setPitch(float pitch) {
|
||||||
} else if (sarg >= 0.99999) {
|
Vector euler = toEuler();
|
||||||
yaw = 2 * atan2(y, x);
|
*this = Quaternion::fromEuler(Vector(euler.x, pitch, euler.z));
|
||||||
} else {
|
|
||||||
yaw = atan2(2 * (x * y + w * z), sqw + sqx - sqy - sqz);
|
|
||||||
}
|
|
||||||
return yaw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setYaw(float yaw) {
|
void setYaw(float yaw) {
|
||||||
// TODO: optimize?
|
|
||||||
Vector euler = toEuler();
|
Vector euler = toEuler();
|
||||||
euler.z = yaw;
|
*this = Quaternion::fromEuler(Vector(euler.x, euler.y, yaw));
|
||||||
(*this) = Quaternion::fromEuler(euler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion operator * (const Quaternion& q) const {
|
Quaternion operator * (const Quaternion& q) const {
|
||||||
|
Reference in New Issue
Block a user