// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0.If a copy of the MPL was not distributed with this // file, You can obtain one at https ://mozilla.org/MPL/2.0/. #include "SwingTwist.h" template SwingTwistOf::SwingTwistOf() { this->swing = DirectionOf(AngleOf(), AngleOf()); this->twist = AngleOf(); } template Passer::LinearAlgebra::SwingTwistOf::SwingTwistOf(DirectionOf swing, AngleOf twist) { this->swing = swing; this->twist = twist; } template SwingTwistOf::SwingTwistOf(AngleOf horizontal, AngleOf vertical, AngleOf twist) { // this->horizontal = horizontal; // this->vertical = vertical; this->swing = DirectionOf(horizontal, vertical); this->twist = twist; } template SwingTwistOf SwingTwistOf::Degrees(float horizontal, float vertical, float twist) { DirectionOf swing = DirectionOf::Degrees(horizontal, vertical); AngleOf twistAngle = AngleOf::Degrees(twist); SwingTwistOf orientation = SwingTwistOf(swing, twistAngle); return orientation; } template Quaternion SwingTwistOf::ToQuaternion() const { Quaternion q = Quaternion::Euler(this->swing.vertical.InDegrees(), this->swing.horizontal.InDegrees(), this->twist.InDegrees()); return q; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::FromQuaternion( Quaternion q) { Vector3 angles = Quaternion::ToAngles(q); SwingTwistOf r = SwingTwistOf::Degrees(angles.Up(), angles.Right(), angles.Forward()); return r; } template SphericalOf Passer::LinearAlgebra::SwingTwistOf::ToAngleAxis() const { Quaternion q = this->ToQuaternion(); float angle; Vector3 axis; q.ToAngleAxis(&angle, &axis); DirectionOf direction = DirectionOf::FromVector3(axis); SphericalOf aa = SphericalOf(angle, direction); return aa; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::FromAngleAxis( SphericalOf aa) { Vector3 vectorAxis = aa.direction.ToVector3(); Quaternion q = Quaternion::AngleAxis(aa.distance, vectorAxis); return SwingTwistOf(); } template const SwingTwistOf SwingTwistOf::identity = SwingTwistOf(); template SphericalOf SwingTwistOf::operator*(const SphericalOf& vector) const { SphericalOf v = SphericalOf( vector.distance, vector.direction.horizontal + this->swing.horizontal, vector.direction.vertical + this->swing.vertical); return v; } template SwingTwistOf SwingTwistOf::operator*( const SwingTwistOf& rotation) const { SwingTwistOf r = SwingTwistOf(this->swing.horizontal + rotation.swing.horizontal, this->swing.vertical + rotation.swing.vertical, this->twist + rotation.twist); return r; } template SwingTwistOf SwingTwistOf::operator*=(const SwingTwistOf& rotation) { this->swing.horizontal += rotation.swing.horizontal; this->swing.vertical += rotation.swing.vertical; this->twist += rotation.twist; return *this; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::Inverse( SwingTwistOf rotation) { SwingTwistOf r = SwingTwistOf( -rotation.swing.horizontal, -rotation.swing.vertical, -rotation.twist); return r; } template SwingTwistOf Passer::LinearAlgebra::SwingTwistOf::AngleAxis( float angle, const SphericalOf& axis) { Vector3 axis_vector = axis.ToVector3(); Quaternion q = Quaternion::AngleAxis(angle, axis_vector); SwingTwistOf r = SwingTwistOf::FromQuaternion(q); return r; } template class SwingTwistOf; template class SwingTwistOf;