Fix quat::Quat::from_angle_{x|y|z}

These functions were broken due to mistakenly using the full angle theta
in one place instead of theta / 2. This resulted in non-unit
quaternions that definitely did not rotate things correctly.
This commit is contained in:
Lennart 2014-01-26 21:33:30 -08:00
parent a7c2ddf2ca
commit ba71cb4a37

View file

@ -50,19 +50,22 @@ Quat<S> {
/// Create a matrix from a rotation around the `x` axis (pitch).
#[inline]
pub fn from_angle_x(theta: Rad<S>) -> Quat<S> {
Quat::new(cos(theta.mul_s(cast(0.5).unwrap())), sin(theta), zero(), zero())
let (s, c) = sin_cos(theta.mul_s(cast(0.5).unwrap()));
Quat::new(c, s, zero(), zero())
}
/// Create a matrix from a rotation around the `y` axis (yaw).
#[inline]
pub fn from_angle_y(theta: Rad<S>) -> Quat<S> {
Quat::new(cos(theta.mul_s(cast(0.5).unwrap())), zero(), sin(theta), zero())
let (s, c) = sin_cos(theta.mul_s(cast(0.5).unwrap()));
Quat::new(c, zero(), s, zero())
}
/// Create a matrix from a rotation around the `z` axis (roll).
#[inline]
pub fn from_angle_z(theta: Rad<S>) -> Quat<S> {
Quat::new(cos(theta.mul_s(cast(0.5).unwrap())), zero(), zero(), sin(theta))
let (s, c) = sin_cos(theta.mul_s(cast(0.5).unwrap()));
Quat::new(c, zero(), zero(), s)
}
/// Create a quaternion from a set of euler angles.