Skip to content

Instantly share code, notes, and snippets.

@Kerollmops
Last active November 4, 2017 12:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kerollmops/98275b0ad22e792a9bc40bd4aee2b2fb to your computer and use it in GitHub Desktop.
Save Kerollmops/98275b0ad22e792a9bc40bd4aee2b2fb to your computer and use it in GitHub Desktop.
A function that create a ray from a perspective camera
use cgmath::{Point2, Point3, Vector3, Vector4, Matrix4};
use cgmath::{SquareMatrix, InnerSpace};
use collision::{Ray, Ray3};
// http://antongerdelan.net/opengl/raycasting.html
fn ray_from_cam(proj: Matrix4<f32>, view: Matrix4<f32>, point: Point2<f32>) -> Ray3<f32> {
assert!(point.x >= -1.0 && point.x <= 1.0);
assert!(point.y >= -1.0 && point.y <= 1.0);
// 4d Homogeneous Clip Coordinates
let ray_clip = Vector4::new(point.x, point.y, -1.0, 1.0);
// 4d Eye (Camera) Coordinates
let ray_eye = proj.invert().unwrap() * ray_clip;
let ray_eye = Vector4::new(ray_eye.x, ray_eye.y, -1.0, 0.0);
// 4d World Coordinates
let ray_world = (view.invert().unwrap() * ray_eye).truncate(); // into Vector3
// don't forget to normalise the vector at some point
let ray_world = ray_world.normalize();
Ray::new(Point3::new(0.0, 0.0, 0.0), ray_world)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment