/* math/axis.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_MATH_AXIS_H__ #define __INCLUDED_MATH_AXIS_H__ #include #include "math/vector3f.h" #include "LinearMath/btMatrix3x3.h" namespace math { /// a local coordinates system class Axis { public: Axis(); Axis(const Axis & other); void clear(); void assign(const Axis & other); void assign(const btMatrix3x3 & other); /** * @brief assign radiant yaw, pitch and roll angles. * This method changes the sign of the pitch and roll angles * before applying them */ void assign(const float yaw, const float pitch, const float roll); /// global coordinates of the X-axis in the local coordinates system inline const Vector3f & forward() const { return axis_vector[0]; } /// global coordinates of the Y-axis in the local coordinates system inline const Vector3f & left() const { return axis_vector[1]; } /// global coordinates of the Z-axis in the local coordinates system inline const Vector3f & up() const { return axis_vector[2]; } inline Vector3f & operator[](size_t index) { return axis_vector[index]; } inline const Vector3f & operator[](size_t index) const { return axis_vector[index]; } Axis & operator=(const Axis & other); const Axis operator*(const Axis &other) const; /** * @brief change axis direction angle * rotate around axis up vector (positive is left) * @param angle angle in degrees **/ void change_direction(const float angle); /** * @brief change axis pitch angle * rotate around left vector (positive is up) * @param angle angle in degrees **/ void change_pitch(const float angle); /** * @brief change axis roll angle * rotate around forward vector (positive is left) * @param angle angle in degrees **/ void change_roll(const float angle); /** * @brief rotation about an arbitrary vector * @param rad angle in radians **/ void rotate(Vector3f const &normal, float cosa, float sina); void rotate(const Vector3f & normal, const float rad); /// return the transpose of this matrix const Axis transpose() const; private: Vector3f axis_vector[3]; }; /// helper function to conver math::Axis to btMatrix3x3 inline btMatrix3x3 to_btMatrix3x3(const math::Axis &a) { return btMatrix3x3(a[0][0], a[1][0], a[2][0], a[0][1], a[1][1], a[2][1], a[0][2], a[1][2], a[2][2]); } /// write an axis to a std::ostream std::ostream &operator<<(std::ostream & os, const Axis & axis); /// read an axis from a std::istream std::istream &operator>>(std::istream & is, Axis & axis); /// local-to-global coordinates Vector3f operator*(const Axis &axis, const Vector3f &vector); } #endif // __INCLUDED_MATH_AXIS_H__