pub struct Camera {
pub matrix: Matrix4,
/* private fields */
}Expand description
Camera
A Scene holds only one Camera.
Fields§
§matrix: Matrix4camera matrix
This matrix must be in the Euclidean momentum group, the semi-direct product of O(3) and R^3.
Implementations§
Source§impl Camera
impl Camera
Sourcepub fn position(&self) -> Point3
pub fn position(&self) -> Point3
Returns the position of camera, the forth column of the camera matrix.
§Examples
use truck_platform::*;
use truck_base::cgmath64::*;
let mut camera = Camera::default();
camera.matrix = Matrix4::from_translation(Vector3::new(1.0, 2.0, 3.0));
assert_eq!(camera.position(), Point3::new(1.0, 2.0, 3.0));Sourcepub fn eye_direction(&self) -> Vector3
pub fn eye_direction(&self) -> Vector3
Returns the eye direction of camera. the inverse of the z-axis of the camera matrix.
§Examples
use std::f64::consts::PI;
use truck_platform::*;
use truck_base::{cgmath64::*, tolerance::Tolerance};
let mut camera = Camera::default();
camera.matrix = Matrix4::from_axis_angle(
Vector3::new(1.0, 1.0, 1.0).normalize(),
Rad(2.0 * PI / 3.0),
);
assert!(camera.eye_direction().near(&-Vector3::unit_x()));Sourcepub fn head_direction(&self) -> Vector3
pub fn head_direction(&self) -> Vector3
Returns the direction of the head vector, the y-axis of the camera matrix.
§Examples
use std::f64::consts::PI;
use truck_platform::*;
use truck_base::{cgmath64::*, tolerance::Tolerance};
let mut camera = Camera::default();
camera.matrix = Matrix4::from_axis_angle(
Vector3::new(1.0, 1.0, 1.0).normalize(),
Rad(2.0 * PI / 3.0),
);
assert!(camera.head_direction().near(&Vector3::unit_z()));Sourcepub const fn projection_type(&self) -> ProjectionType
pub const fn projection_type(&self) -> ProjectionType
Returns the projection type of the camera.
§Examples
use truck_platform::*;
// the projection type of the default camera is perspective.
assert_eq!(Camera::default().projection_type(), ProjectionType::Perspective);Sourcepub fn perspective_camera<R: Into<Rad<f64>>>(
matrix: Matrix4,
field_of_view: R,
near_clip: f64,
far_clip: f64,
) -> Camera
pub fn perspective_camera<R: Into<Rad<f64>>>( matrix: Matrix4, field_of_view: R, near_clip: f64, far_clip: f64, ) -> Camera
Creates a perspective camera.
§Arguments
matrix: camera matrixfield_of_view: FOV, based on the vertical direction of the screen.near_clip: distance to the nearest face of the view volumefar_clip: distance to the farthest face of the view volume
§Examples
use std::f64::consts::PI;
use truck_base::{cgmath64::*, tolerance::Tolerance};
use truck_platform::*;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::perspective_camera(
// depends on the difference of the style with cgmath,
// the matrix must be inverted
matrix.invert().unwrap(),
Rad(PI / 4.0),
0.1,
1.0,
);
assert!(camera.eye_direction().near(&-Vector3::new(1.0, 1.0, 1.0).normalize()));
assert_eq!(camera.projection_type(), ProjectionType::Perspective);Sourcepub fn parallel_camera(
matrix: Matrix4,
screen_size: f64,
near_clip: f64,
far_clip: f64,
) -> Camera
pub fn parallel_camera( matrix: Matrix4, screen_size: f64, near_clip: f64, far_clip: f64, ) -> Camera
Creates a parallel camera.
§Arguments
matrix: camera matrixscreen_size: screen size, based on the vertical direction of the screen.`near_clip: distance to the nearest face of the view volumefar_clip: distance to the farthest face of the view volume
§Examples
use truck_base::{cgmath64::*, tolerance::Tolerance};
use truck_platform::*;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::parallel_camera(
// depends on the difference of the style with cgmath,
// the matrix must be inverted
matrix.invert().unwrap(),
1.0,
0.1,
1.0,
);
assert!(camera.head_direction().near(&Vector3::new(-0.5, 1.0, -0.5).normalize()));
assert_eq!(camera.projection_type(), ProjectionType::Parallel);Sourcepub fn projection(&self, as_rat: f64) -> Matrix4
pub fn projection(&self, as_rat: f64) -> Matrix4
Returns the projection matrix into the normalized view volume.
§Arguments
as_rat: the aspect ratio, x-resolution / y-resulution.
§Examples
// perspective camera
use std::f64::consts::PI;
use truck_base::{assert_near, cgmath64::*, tolerance::*};
use truck_platform::*;
let fov = PI / 4.0;
let as_rat = 1.2;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::perspective_camera(
matrix.invert().unwrap(),
Rad(fov),
0.1,
10.0,
);
// calculation by the ray-tracing
let pt = Point3::new(-1.5, -1.4, -2.5);
let vec = pt - camera.position();
let far = 1.0 / (fov / 2.0).tan();
let dir = camera.eye_direction();
let y_axis = camera.head_direction();
let x_axis = dir.cross(y_axis);
let proj_length = dir.dot(vec);
let h = (vec - proj_length * dir) * far / proj_length;
let u = h.dot(x_axis) / as_rat;
let v = h.dot(y_axis);
// check the answer
let uv = camera.projection(as_rat).transform_point(pt);
assert_near!(u, uv[0]);
assert_near!(v, uv[1]);// parallel camera
use truck_base::{assert_near, cgmath64::*, tolerance::*};
use truck_platform::*;
let size = 3.0;
let as_rat = 1.2;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::parallel_camera(
matrix.invert().unwrap(),
size,
0.1,
10.0,
);
// calculation by the ray-tracing
let pt = Point3::new(-1.5, -1.4, -2.5);
let vec = pt - camera.position();
let dir = camera.eye_direction();
let y_axis = camera.head_direction();
let x_axis = dir.cross(y_axis);
let h = vec - vec.dot(dir) * dir;
let u = h.dot(x_axis) / (size / 2.0) / as_rat;
let v = h.dot(y_axis) / (size / 2.0);
// check the answer
let uv = camera.projection(as_rat).transform_point(pt);
assert_near!(u, uv[0]);
assert_near!(v, uv[1]);Sourcepub fn buffer(&self, as_rat: f64, device: &Device) -> BufferHandler
pub fn buffer(&self, as_rat: f64, device: &Device) -> BufferHandler
Sourcepub fn ray(&self, coord: Point2) -> Ray
pub fn ray(&self, coord: Point2) -> Ray
Returns the ray from camera with aspect-ratio = 1.0.
§Examples
// Perspective case
use std::f64::consts::PI;
use truck_base::{assert_near, cgmath64::*, tolerance::Tolerance};
use truck_platform::*;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::perspective_camera(
// depends on the difference of the style with cgmath,
// the matrix must be inverted
matrix.invert().unwrap(),
Rad(PI / 4.0),
0.1,
1.0,
);
// take a point in the 3D space
let point = Point3::new(0.1, 0.15, 0.0);
// project to the normalized view volume
let uvz = camera.projection(1.0).transform_point(point);
// coordinate on the screen
let uv = Point2::new(uvz.x, uvz.y);
let ray = camera.ray(uv);
// the origin of the ray is camera position
assert_near!(ray.origin(), camera.position());
// the direction of the ray is the normalized vector of point - camera.position().
assert_near!(ray.direction(), (point - camera.position()).normalize());// Parallel case
use truck_base::{assert_near, cgmath64::*, tolerance::*};
use truck_platform::*;
let matrix = Matrix4::look_at_rh(
Point3::new(1.0, 1.0, 1.0),
Point3::origin(),
Vector3::new(0.0, 1.0, 0.0),
);
let camera = Camera::parallel_camera(
matrix.invert().unwrap(),
3.0,
0.1,
10.0,
);
// take a point in the 3D space
let point = Point3::new(0.1, 0.15, 0.0);
// the projection of the point to the screen
let projed = point
- camera.eye_direction() * camera.eye_direction().dot(point - camera.position());
// project to the normalized view volume
let uvz = camera.projection(1.0).transform_point(point);
// coordinate on the screen
let uv = Point2::new(uvz.x, uvz.y);
let ray = camera.ray(uv);
// the origin of the ray is the projection of the point.
assert_near!(ray.origin(), projed);
// the direction of the ray is eye direction.
assert_near!(ray.direction(), camera.eye_direction());Trait Implementations§
Auto Trait Implementations§
impl Freeze for Camera
impl RefUnwindSafe for Camera
impl Send for Camera
impl Sync for Camera
impl Unpin for Camera
impl UnsafeUnpin for Camera
impl UnwindSafe for Camera
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.