aboutsummaryrefslogtreecommitdiff
path: root/src/camera
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera')
-rw-r--r--src/camera/camera.rs40
-rw-r--r--src/camera/mod.rs2
2 files changed, 41 insertions, 1 deletions
diff --git a/src/camera/camera.rs b/src/camera/camera.rs
new file mode 100644
index 0000000..102e57b
--- /dev/null
+++ b/src/camera/camera.rs
@@ -0,0 +1,40 @@
+//! Implements ray generation
+//!
+//! Rays are generated by transforming between different spaces summed below.
+//!
+//! - *World space*: Where objects are located in the scene, this will be 3d coordinates
+//! - *Camera space*: Originated at the origin of the camera, with z mapped to the viewing
+//! direction
+//!
+//! Camera space will be represented in different ways:
+//! - *Screen space*: Everything in the screen space is projected onto the film, when z=0 this will
+//! correspond
+//! - *Normalized Device Coordinates(NDC) space*: Is defined as (0, 0, 0) as the upper-left corner of
+//! the film, and (1, 1, 0) to be the bottom right corner.
+//! - *Raster space*: Same as NDC space but, (1, 1, 0) is mapped to (width, height, 0)
+//!
+//! More in depth description is in pbr-book chapter 6
+use crate::Float;
+use crate::core::{Transform, Ray, Vector2i, Bound2f};
+
+/// General implementation for all projective based cameras
+struct ProjectiveCamera {
+ cam2wor: Transform,
+ cam2scr: Transform,
+}
+
+impl ProjectiveCamera {
+ fn new(cam2wor: Transform, cam2scr: Transform, resolution: &Vector2i, screenwindow: &Bound2f) -> Self {
+ let screensize = screenwindow.diagonal();
+ // Calculate the conversion from screen space to raster space
+ let scr2ras = Transform::new_scale(resolution.x as Float, resolution.y as Float, 1.0) *
+ Transform::new_scale(1.0 / (screensize.x), 1.0 / (screensize.y), 1.0) *
+ Transform::new_translate(-screenwindow.min.x, -screenwindow.min.y, 0.0);
+ let ras2scr =
+
+ Self {
+ cam2wor,
+ cam2scr,
+ }
+ }
+}
diff --git a/src/camera/mod.rs b/src/camera/mod.rs
index 4865a36..41f9598 100644
--- a/src/camera/mod.rs
+++ b/src/camera/mod.rs
@@ -7,4 +7,4 @@
pub mod film;
//pub mod filter;
-//pub mod camera;
+pub mod camera;