diff --git a/src/quat.rs b/src/quat.rs index aaab24e..e3bf2cf 100644 --- a/src/quat.rs +++ b/src/quat.rs @@ -311,26 +311,43 @@ pub impl Quat { // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 #[inline(always)] - static pure fn from_angle_x>(_theta: A) -> Quat { - fail(~"Not yet implemented!") + static pure fn from_angle_x>(theta: A) -> Quat { + let _0 = Number::from(0); + let _2 = Number::from(2); + let rad = theta.to_radians(); + Quat::new((rad / _2).cos(), rad.sin(), _0, _0) } // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 #[inline(always)] - static pure fn from_angle_y>(_theta: A) -> Quat { - fail(~"Not yet implemented!") + static pure fn from_angle_y>(theta: A) -> Quat { + let _0 = Number::from(0); + let _2 = Number::from(2); + let rad = theta.to_radians(); + Quat::new((rad / _2).cos(), _0, rad.sin(), _0) } // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 #[inline(always)] - static pure fn from_angle_z>(_theta: A) -> Quat { - fail(~"Not yet implemented!") + static pure fn from_angle_z>(theta: A) -> Quat { + let _0 = Number::from(0); + let _2 = Number::from(2); + let rad = theta.to_radians(); + Quat::new((rad / _2).cos(), _0, _0, rad.sin()) } // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 #[inline(always)] - static pure fn from_angle_xyz>(_x: A, _y: A, _z: A) -> Quat { - fail(~"Not yet implemented!") + static pure fn from_angle_xyz>(x: A, y: A, z: A) -> Quat { + // http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Conversion + let _2 = Number::from(2); + let xdiv2 = x.to_radians() / _2; + let ydiv2 = y.to_radians() / _2; + let zdiv2 = z.to_radians() / _2; + Quat::new(cos(&zdiv2) * cos(&xdiv2) * cos(&ydiv2) + sin(&zdiv2) * sin(&xdiv2) * sin(&ydiv2), + sin(&zdiv2) * cos(&xdiv2) * cos(&ydiv2) - cos(&zdiv2) * sin(&xdiv2) * sin(&ydiv2), + cos(&zdiv2) * sin(&xdiv2) * cos(&ydiv2) + sin(&zdiv2) * cos(&xdiv2) * sin(&ydiv2), + cos(&zdiv2) * cos(&xdiv2) * sin(&ydiv2) - sin(&zdiv2) * sin(&xdiv2) * cos(&ydiv2)) } // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 @@ -348,8 +365,8 @@ pub impl Quat { // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306 #[inline(always)] - static pure fn look_at(_dir: &Vec3, _up: &Vec3) -> Quat { - fail(~"Not yet implemented!") + static pure fn look_at(dir: &Vec3, up: &Vec3) -> Quat { + Mat3::look_at(dir, up).to_quat() } // TODO: Move to Rotation implementation. See: https://github.com/mozilla/rust/issues/4306