quanternion from euler

This commit is contained in:
Jorijn van der Graaf 2026-02-20 04:41:08 +01:00
commit 00acab154b

View file

@ -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
);
}
};
}