cgmath/src/projection.rs

45 lines
1.3 KiB
Rust
Raw Normal View History

2012-09-07 10:48:47 +00:00
import float::consts::pi;
import mat::*;
//
// Create a perspective projection matrix
//
// fov is in degrees
// http://www.opengl.org/wiki/GluPerspective_code
//
pure fn perspective(fovy:float, aspectRatio:float, near:float, fa:float) -> mat4 {
let ymax = near * tan(fovy * PI / 360.0);
let xmax = ymax * aspectRatio;
return frustum(-xmax, xmax, -ymax, ymax, near, far);
}
//
// Define a view frustrum
// http://www.felixgers.de/teaching/jogl/perspectiveProjection.html
// http://www.opengl.org/wiki/GluPerspective_code
//
// TODO: double check algorithm
//
pure fn frustum(left:float, right:float, bottom:float, top:float, near:float, far:float) -> mat4 {
let m00:float = (2*near)/(right-left);
let m01:float = 0.0;
let m02:float = 0.0;
let m03:float = 0.0;
let m10:float = 0.0;
let m11:float = (2*near)/(top-bottom);
let m12:float = 0.0;
let m13:float = 0.0;
let m20:float = (right+left)/(right-left);
let m21:float = (top+bottom)/(top-bottom);
let m22:float = -(far+near)/(far-near);
let m23:float = -1.0;
let m30:float = 0.0;
let m31:float = 0.0;
let m32:float = -(2*far*near)/(far-near);
let m33:float = 0.0;
return mat4(m00, m01, m02, m03,
m10, m11, m12, m13,
m20, m21, m22, m23,
m30, m31, m32, m33);
}