forked from M-Labs/nalgebra
Mint quaternions
This commit is contained in:
parent
2cd79851c3
commit
b0127ab5dc
@ -5,6 +5,8 @@ use alga::linear::Rotation as AlgaRotation;
|
|||||||
|
|
||||||
use core::{Vector4, Matrix4};
|
use core::{Vector4, Matrix4};
|
||||||
use core::dimension::U3;
|
use core::dimension::U3;
|
||||||
|
#[cfg(feature = "mint")]
|
||||||
|
use core::storage::Storage;
|
||||||
use geometry::{Quaternion, UnitQuaternion, Rotation, Isometry, Similarity,
|
use geometry::{Quaternion, UnitQuaternion, Rotation, Isometry, Similarity,
|
||||||
Transform, SuperTCategoryOf, TAffine, Translation,
|
Transform, SuperTCategoryOf, TAffine, Translation,
|
||||||
Rotation3, Point3};
|
Rotation3, Point3};
|
||||||
@ -21,6 +23,9 @@ use geometry::{Quaternion, UnitQuaternion, Rotation, Isometry, Similarity,
|
|||||||
* UnitQuaternion -> Transform<U3>
|
* UnitQuaternion -> Transform<U3>
|
||||||
* UnitQuaternion -> Matrix<U4> (homogeneous)
|
* UnitQuaternion -> Matrix<U4> (homogeneous)
|
||||||
*
|
*
|
||||||
|
* mint::Quaternion <-> Quaternion
|
||||||
|
* UnitQuaternion -> mint::Quaternion
|
||||||
|
*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
* UnitQuaternion -> Quaternion is already provided by: Unit<T> -> T
|
* UnitQuaternion -> Quaternion is already provided by: Unit<T> -> T
|
||||||
*/
|
*/
|
||||||
@ -166,3 +171,43 @@ impl<N1: Real, N2: Real + SupersetOf<N1>> SubsetOf<Matrix4<N2>> for UnitQuaterni
|
|||||||
Self::from_rotation_matrix(&rot)
|
Self::from_rotation_matrix(&rot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "mint")]
|
||||||
|
impl<N, S> From<mint::Quaternion<N>> for QuaternionBase<N, S>
|
||||||
|
where
|
||||||
|
N: Real,
|
||||||
|
S: OwnedStorage<N, U4, U1>,
|
||||||
|
S::Alloc: OwnedAllocator<N, U4, U1, S>,
|
||||||
|
{
|
||||||
|
fn from(q: mint::Quaternion<N>) -> Self {
|
||||||
|
QuaternionBase::new(q.s, q.v.x, q.v.y, q.v.z)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "mint")]
|
||||||
|
impl<N: Real, S: Storage<N, U4, U1>> Into<mint::Quaternion<N>> for QuaternionBase<N, S> {
|
||||||
|
fn into(self) -> mint::Quaternion<N> {
|
||||||
|
mint::Quaternion {
|
||||||
|
v: mint::Vector3 {
|
||||||
|
x: self[0],
|
||||||
|
y: self[1],
|
||||||
|
z: self[2],
|
||||||
|
},
|
||||||
|
s: self[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "mint")]
|
||||||
|
impl<N: Real, S: Storage<N, U4, U1>> Into<mint::Quaternion<N>> for UnitQuaternionBase<N, S> {
|
||||||
|
fn into(self) -> mint::Quaternion<N> {
|
||||||
|
mint::Quaternion {
|
||||||
|
v: mint::Vector3 {
|
||||||
|
x: self[0],
|
||||||
|
y: self[1],
|
||||||
|
z: self[2],
|
||||||
|
},
|
||||||
|
s: self[3],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -11,6 +11,8 @@ use na::{
|
|||||||
Matrix6x2, Matrix6x3, Matrix6x4, Matrix6x5,
|
Matrix6x2, Matrix6x3, Matrix6x4, Matrix6x5,
|
||||||
Point3, Translation3, Isometry3, Similarity3, Affine3,
|
Point3, Translation3, Isometry3, Similarity3, Affine3,
|
||||||
Projective3, Transform3, Rotation3, UnitQuaternion};
|
Projective3, Transform3, Rotation3, UnitQuaternion};
|
||||||
|
#[cfg(feature = "mint")]
|
||||||
|
use na::Quaternion;
|
||||||
|
|
||||||
|
|
||||||
#[cfg(feature = "arbitrary")]
|
#[cfg(feature = "arbitrary")]
|
||||||
@ -283,3 +285,18 @@ mint_vector_conversion!(
|
|||||||
mint_vector_conversion_3, Vector3, 3;
|
mint_vector_conversion_3, Vector3, 3;
|
||||||
mint_vector_conversion_4, Vector4, 4;
|
mint_vector_conversion_4, Vector4, 4;
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mint_quaternion_conversions() {
|
||||||
|
let q = Quaternion::new(0.1f64, 0.2, 0.3, 0.4);
|
||||||
|
let mq: mint::Quaternion<f64> = q.into();
|
||||||
|
let q2 = Quaternion::from(mq);
|
||||||
|
|
||||||
|
assert_eq!(mq.v.x, q[0]);
|
||||||
|
assert_eq!(mq.v.y, q[1]);
|
||||||
|
assert_eq!(mq.v.z, q[2]);
|
||||||
|
assert_eq!(mq.s, q[3]);
|
||||||
|
|
||||||
|
assert_eq!(q, q2);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user