quanternion from euler
This commit is contained in:
parent
a4b70aecda
commit
00acab154b
1 changed files with 25 additions and 0 deletions
|
|
@ -381,6 +381,15 @@ namespace Crafter {
|
|||
return v + t * q.w + Vector<T, 3, Aligment>::Cross(qv, t);
|
||||
}
|
||||
|
||||
template <typename AT, std::uint32_t AAlignment, typename BT, std::uint32_t BAlignment, typename PT, std::uint32_t PAlignment>
|
||||
constexpr static Vector<T, 3, Aligment> RotatePivot(Vector<AT, 3, AAlignment> v, Vector<BT, 4, BAlignment> q, Vector<PT, 3, PAlignment> pivot) requires(Len == 3) {
|
||||
Vector<T, 3, 0> translated = v - pivot;
|
||||
Vector<T, 3, 0> qv(q.x, q.y, q.z);
|
||||
Vector<T, 3, 0> t = Cross(qv, translated) * T(2);
|
||||
Vector<T, 3, 0> rotated = translated + t * q.w +Cross(qv, t);
|
||||
return rotated + pivot;
|
||||
}
|
||||
|
||||
template <typename AT, std::uint32_t AAlignment, typename BT, std::uint32_t BAlignment, typename CT, std::uint32_t CAlignment>
|
||||
constexpr static Vector<T, 4, Aligment> QuanternionFromBasis(Vector<AT, 3, AAlignment> right, Vector<BT, 3, BAlignment> up, Vector<CT, 3, CAlignment> forward) requires(Len == 4) {
|
||||
T m00 = right.x;
|
||||
|
|
@ -431,6 +440,22 @@ namespace Crafter {
|
|||
q.Normalize();
|
||||
return q;
|
||||
}
|
||||
|
||||
constexpr static Vector<T, 4, Aligment> QuanternionFromEuler(T roll, T pitch, T yaw) {
|
||||
T cr = std::cos(roll * 0.5);
|
||||
T sr = std::sin(roll * 0.5);
|
||||
T cp = std::cos(pitch * 0.5);
|
||||
T sp = std::sin(pitch * 0.5);
|
||||
T cy = std::cos(yaw * 0.5);
|
||||
T sy = std::sin(yaw * 0.5);
|
||||
|
||||
return Vector<T, 4, Aligment>(
|
||||
sr * cp * cy - cr * sp * sy,
|
||||
cr * sp * cy + sr * cp * sy,
|
||||
cr * cp * sy - sr * sp * cy,
|
||||
cr * cp * cy + sr * sp * sy
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue