Add angle module
This commit is contained in:
parent
10f2b9b0b1
commit
287fae7114
5 changed files with 43 additions and 27 deletions
34
src/angle.rs
Normal file
34
src/angle.rs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
use num::cast::*;
|
||||||
|
use vec::Vec3;
|
||||||
|
|
||||||
|
pub enum Angle<T> {
|
||||||
|
degrees(T),
|
||||||
|
radians(T),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub impl<T:Copy Num NumCast> Angle<T> {
|
||||||
|
pure fn degrees() -> T {
|
||||||
|
match self {
|
||||||
|
degrees(theta) => theta,
|
||||||
|
radians(theta) => theta * cast(180f64 / f64::consts::pi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pure fn radians() -> T {
|
||||||
|
match self {
|
||||||
|
degrees(theta) => theta * cast(f64::consts::pi / 180f64),
|
||||||
|
radians(theta) => theta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct AxisRotation<T> {
|
||||||
|
axis: Vec3<T>,
|
||||||
|
theta: Angle<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Euler<T> {
|
||||||
|
x: T, // pitch
|
||||||
|
y: T, // yaw
|
||||||
|
z: T, // roll
|
||||||
|
}
|
21
src/euler.rs
21
src/euler.rs
|
@ -1,21 +0,0 @@
|
||||||
// TODO
|
|
||||||
|
|
||||||
pub trait EulerAngles<T> {
|
|
||||||
// to_mat3
|
|
||||||
// to_mat4
|
|
||||||
// to_quat
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Euler<T> { x: T, y: T, z: T } // pitch / yaw / roll
|
|
||||||
|
|
||||||
pub mod Euler {
|
|
||||||
#[inline(always)]
|
|
||||||
pub pure fn new<T>(x: T, y: T, z: T) -> Euler<T> {
|
|
||||||
Euler { x: move x, y: move y, z: move z }
|
|
||||||
}
|
|
||||||
|
|
||||||
// from_mat3
|
|
||||||
// from_quat
|
|
||||||
}
|
|
||||||
|
|
||||||
pub impl<T> Euler<T>: EulerAngles {}
|
|
|
@ -1,4 +1,5 @@
|
||||||
use funs::transform::*;
|
use funs::transform::*;
|
||||||
|
use angle::degrees;
|
||||||
use mat::Mat4;
|
use mat::Mat4;
|
||||||
use vec::{Vec3, Vec4};
|
use vec::{Vec3, Vec4};
|
||||||
|
|
||||||
|
@ -7,7 +8,7 @@ fn test_mat4_from_rotation() {
|
||||||
{
|
{
|
||||||
let pos = Vec4::new(1f32, 0f32, 0f32, 1f32);
|
let pos = Vec4::new(1f32, 0f32, 0f32, 1f32);
|
||||||
// let tform = mat4_from_rotation(180f32, Vec3::unit_z());
|
// let tform = mat4_from_rotation(180f32, Vec3::unit_z());
|
||||||
let tform = mat4_from_rotation(180f32, Vec3::new(0f32, 0f32, 1f32));
|
let tform = mat4_from_rotation(degrees(180f32), Vec3::new(0f32, 0f32, 1f32));
|
||||||
let newpos = tform.mul_v(&pos);
|
let newpos = tform.mul_v(&pos);
|
||||||
|
|
||||||
let expected = Vec4::new(-1f32, 0f32, 0f32, 1f32);
|
let expected = Vec4::new(-1f32, 0f32, 0f32, 1f32);
|
||||||
|
@ -19,8 +20,8 @@ fn test_mat4_from_rotation() {
|
||||||
|
|
||||||
// let tform_a = mat4_from_rotation(90f32, Vec3::unit_y());
|
// let tform_a = mat4_from_rotation(90f32, Vec3::unit_y());
|
||||||
// let tform_b = mat4_from_rotation(90f32, -Vec3::unit_y());
|
// let tform_b = mat4_from_rotation(90f32, -Vec3::unit_y());
|
||||||
let tform_a = mat4_from_rotation(90f32, Vec3::new(0f32, 1f32, 0f32));
|
let tform_a = mat4_from_rotation(degrees(90f32), Vec3::new(0f32, 1f32, 0f32));
|
||||||
let tform_b = mat4_from_rotation(90f32, -Vec3::new(0f32, 1f32, 0f32));
|
let tform_b = mat4_from_rotation(degrees(90f32), -Vec3::new(0f32, 1f32, 0f32));
|
||||||
let newpos_a = tform_a.mul_v(&pos);
|
let newpos_a = tform_a.mul_v(&pos);
|
||||||
let newpos_b = tform_b.mul_v(&pos);
|
let newpos_b = tform_b.mul_v(&pos);
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
use funs::trig::*;
|
use funs::trig::*;
|
||||||
|
use angle::Angle;
|
||||||
use mat::{Mat3, Mat4};
|
use mat::{Mat3, Mat4};
|
||||||
use num::cast::*;
|
use num::cast::*;
|
||||||
|
|
||||||
pub pure fn mat3_from_rotation<T:Copy Num NumCast AngleConv Trig>(theta: T, axis: Vec3<T>) -> Mat3<T> {
|
pub pure fn mat3_from_rotation<T:Copy Num NumCast Trig>(theta: Angle<T>, axis: Vec3<T>) -> Mat3<T> {
|
||||||
let rad = radians(&theta);
|
let rad = theta.radians();
|
||||||
let c: T = cos(&rad);
|
let c: T = cos(&rad);
|
||||||
let s: T = sin(&rad);
|
let s: T = sin(&rad);
|
||||||
let _0: T = cast(0);
|
let _0: T = cast(0);
|
||||||
|
@ -15,6 +16,6 @@ pub pure fn mat3_from_rotation<T:Copy Num NumCast AngleConv Trig>(theta: T, axis
|
||||||
t * axis.x * axis.z - s - axis.y, t * axis.y * axis.z - s * axis.x, t * axis.z * axis.z + c)
|
t * axis.x * axis.z - s - axis.y, t * axis.y * axis.z - s * axis.x, t * axis.z * axis.z + c)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub pure fn mat4_from_rotation<T:Copy Num NumCast AngleConv Trig>(theta: T, axis: Vec3<T>) -> Mat4<T> {
|
pub pure fn mat4_from_rotation<T:Copy Num NumCast Trig>(theta: Angle<T>, axis: Vec3<T>) -> Mat4<T> {
|
||||||
mat3_from_rotation(theta, axis).to_mat4()
|
mat3_from_rotation(theta, axis).to_mat4()
|
||||||
}
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
extern mod std;
|
extern mod std;
|
||||||
|
|
||||||
|
pub mod angle;
|
||||||
pub mod dim;
|
pub mod dim;
|
||||||
pub mod gltypes;
|
pub mod gltypes;
|
||||||
pub mod mat;
|
pub mod mat;
|
||||||
|
|
Loading…
Reference in a new issue