From c271199d871a2a4cfcf8e2261b92e8c14d1405d6 Mon Sep 17 00:00:00 2001 From: "Sean P. Kelly" Date: Sun, 1 Dec 2024 22:50:41 -0800 Subject: [PATCH] feat: add camera motion controls --- .gitattributes | 2 + README.md | 2 +- pyraydeon/Cargo.toml | 1 + pyraydeon/examples/py_sphere.py | 5 +- pyraydeon/src/camera.rs | 40 ++++++++-- raydeon/Cargo.toml | 2 +- raydeon/examples/assets/castle.vox | 3 + raydeon/examples/castle.rs | 112 ++++++++++++++++++++++++++ raydeon/examples/cityscape.png | Bin 93645 -> 130 bytes raydeon/src/camera.rs | 123 +++++++++++++++++++++-------- raydeon/src/scene.rs | 22 +++++- 11 files changed, 265 insertions(+), 47 deletions(-) create mode 100644 .gitattributes create mode 100755 raydeon/examples/assets/castle.vox create mode 100644 raydeon/examples/castle.rs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6e0a44b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.vox filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index 9ed0260..87c8de0 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ steal his words (because this port isn't theft enough): This repository has added support for screen-space hatching based on lights placed within the scene. -![](/raydeon/examples/cityscape.png) +![](/raydeon/examples/cityscape.png) ![](/raydeon/examples/castle_expected.svg) ## Example diff --git a/pyraydeon/Cargo.toml b/pyraydeon/Cargo.toml index aeeee4f..e4276ae 100644 --- a/pyraydeon/Cargo.toml +++ b/pyraydeon/Cargo.toml @@ -9,6 +9,7 @@ name = "pyraydeon" crate-type = ["cdylib"] [dependencies] +euclid.workspace = true pyo3 = { workspace = true, features = ["extension-module"] } raydeon.workspace = true numpy.workspace = true diff --git a/pyraydeon/examples/py_sphere.py b/pyraydeon/examples/py_sphere.py index d4f5b8a..2c991a7 100644 --- a/pyraydeon/examples/py_sphere.py +++ b/pyraydeon/examples/py_sphere.py @@ -90,8 +90,8 @@ def paths(self, cam): ) -eye = Point3(0, 0, 5) -focus = Vec3(0, 0, 0) +eye = Point3(0, 0, 0) +focus = Point3(0, 0, -1) up = Vec3(0, 1, 0) fovy = 50.0 @@ -110,6 +110,7 @@ def paths(self, cam): .perspective(fovy, width, height, znear, zfar) .render_options(render_opts) ) +cam.translate((0, 0, 5)) paths = scene.render_with_lighting(cam, seed=5) diff --git a/pyraydeon/src/camera.rs b/pyraydeon/src/camera.rs index 9e8a1ae..e2044ac 100644 --- a/pyraydeon/src/camera.rs +++ b/pyraydeon/src/camera.rs @@ -4,7 +4,7 @@ use pyo3::prelude::*; use crate::linear::{Point3, Vec3}; #[derive(Debug, Clone)] -#[pyclass(frozen)] +#[pyclass] pub(crate) struct Camera(pub(crate) raydeon::Camera); impl ::std::ops::Deref for Camera { @@ -55,19 +55,45 @@ impl Camera { ncam.into() } + fn translate(&mut self, trans: &Bound<'_, PyAny>) -> PyResult<()> { + let trans = Vec3::try_from(trans)?; + self.0.translate(trans.0.cast_unit()); + Ok(()) + } + + fn adjust_yaw(&mut self, yaw: f64) -> PyResult<()> { + self.0.adjust_yaw(euclid::Angle::degrees(yaw)); + Ok(()) + } + + fn adjust_pitch(&mut self, pitch: f64) -> PyResult<()> { + self.0.adjust_pitch(euclid::Angle::degrees(pitch)); + Ok(()) + } + + fn adjust_roll(&mut self, roll: f64) -> PyResult<()> { + self.0.adjust_roll(euclid::Angle::degrees(roll)); + Ok(()) + } + #[getter] fn eye<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { - PyArray::from_slice_bound(py, &self.0.observation.eye.to_array()) + PyArray::from_slice_bound(py, &self.0.observation.eye().to_array()) } #[getter] - fn focus<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { - PyArray::from_slice_bound(py, &self.0.observation.center.to_array()) + fn up<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { + PyArray::from_slice_bound(py, &self.0.observation.up().to_array()) } #[getter] - fn up<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { - PyArray::from_slice_bound(py, &self.0.observation.up.to_array()) + fn right<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { + PyArray::from_slice_bound(py, &self.0.observation.right().to_array()) + } + + #[getter] + fn look<'py>(&self, py: Python<'py>) -> Bound<'py, PyArray> { + PyArray::from_slice_bound(py, &self.0.observation.look().to_array()) } #[getter] @@ -102,7 +128,7 @@ impl Camera { fn __repr__(slf: &Bound<'_, Self>) -> PyResult { let class_name = slf.get_type().qualname()?; - Ok(format!("{}<{:?}>", class_name, slf.borrow().0)) + Ok(format!("{}<{:#?}>", class_name, slf.borrow().0)) } } diff --git a/raydeon/Cargo.toml b/raydeon/Cargo.toml index e589979..7f82aee 100644 --- a/raydeon/Cargo.toml +++ b/raydeon/Cargo.toml @@ -5,7 +5,6 @@ authors = ["cbgbt "] edition = "2021" [dependencies] -anyhow.workspace = true bon.workspace = true cgmath.workspace = true collision.workspace = true @@ -18,5 +17,6 @@ rayon.workspace = true tracing = { workspace = true, features = ["log"] } [dev-dependencies] +dot_vox.workspace = true env_logger.workspace = true svg.workspace = true diff --git a/raydeon/examples/assets/castle.vox b/raydeon/examples/assets/castle.vox new file mode 100755 index 0000000..840de03 --- /dev/null +++ b/raydeon/examples/assets/castle.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c348a638b094730ca5bfd362735ba8b4aa5b65e0c29ea12243bcf1ac972a60a +size 33209 diff --git a/raydeon/examples/castle.rs b/raydeon/examples/castle.rs new file mode 100644 index 0000000..ed55f4c --- /dev/null +++ b/raydeon/examples/castle.rs @@ -0,0 +1,112 @@ +use dot_vox; +use euclid::Angle; +use raydeon::lights::PointLight; +use raydeon::shapes::AxisAlignedCuboid; +use raydeon::{Camera, CameraOptions, DrawableShape, Material, Scene, SceneLighting}; +use std::sync::Arc; + +const CASTLE_VOX: &[u8] = include_bytes!("./assets/castle.vox"); + +fn main() { + env_logger::Builder::from_default_env() + .format_timestamp_nanos() + .init(); + + let castle_vox = dot_vox::load_bytes(CASTLE_VOX).expect("Could not load castle.vox"); + + let geometry: Vec<_> = castle_vox.models[0] + .voxels + .iter() + .map(|v| { + let x = v.x as f64; + let y = v.y as f64; + let z = v.z as f64; + DrawableShape::new() + .geometry(Arc::new( + AxisAlignedCuboid::new() + .min((x + 0.05, y + 0.05, z + 0.05)) + .max((x + 0.95, y + 0.95, z + 0.95)) + .build(), + )) + .material(Material::new().diffuse(5.0).build()) + .build() + }) + .collect(); + + let eye = (10.0, -20.0, 0.0); + let focus = (10.0, 0.0, 0.0); + let up = (0.0, 0.0, 1.0); + + let fovy = 40.0; + let width = 2048; + let height = 2048; + let znear = 0.1; + let zfar = 200.0; + + let mut camera = Camera::configure() + .observation(Camera::look_at(eye, focus, up)) + .perspective(Camera::perspective(fovy, width, height, znear, zfar)) + .render_options(CameraOptions::configure().pen_px_size(4.0).build()) + .build(); + + camera.translate((-15.0, 10.75, 0.0)); + camera.adjust_yaw(Angle::degrees(-45.0)); + camera.translate((-10.5, 0.0, 12.0)); + + let scene = Scene::new() + .geometry(geometry) + .lighting( + SceneLighting::new() + .with_ambient_lighting(0.37) + .with_lights(vec![Arc::new(PointLight::new( + 55.0, + 10.0, + (-10.81, -20.0, 30.0), + 0.0, + 0.13, + 0.19, + ))]), + ) + .construct(); + + let paths = scene + .attach_camera(camera) + .with_seed(0) + .render_with_lighting(); + + let mut svg_doc = svg::Document::new() + .set("width", "8in") + .set("height", "8in") + .set("viewBox", (0, 0, width, height)) + .set("stroke-width", "0.7mm") + .set("stroke", "black") + .set("fill", "none") + .add( + svg::node::element::Group::new().add( + svg::node::element::Rectangle::new() + .set("x", 0) + .set("y", 0) + .set("width", "100%") + .set("height", "100%") + .set("fill", "white"), + ), + ); + + // We have to flip the y-axis in our svg... + let mut item_group = svg::node::element::Group::new() + .set("transform", format!("translate(0, {}) scale(1,-1)", height)); + + for path in paths { + let (p1, p2) = (path.p1, path.p2); + item_group = item_group.add( + svg::node::element::Line::new() + .set("x1", p1.x) + .set("y1", p1.y) + .set("x2", p2.x) + .set("y2", p2.y), + ); + } + + svg_doc = svg_doc.add(item_group); + println!("{}", svg_doc); +} diff --git a/raydeon/examples/cityscape.png b/raydeon/examples/cityscape.png index 3abaab34caf6360421dbbae4a4f795ce332b7b8f..5ebdf968ff0f15d1eceff39a9ab4cce8bf1aa7f7 100644 GIT binary patch literal 130 zcmWN?K@!3s3;@78uiyg~0+N>ghJ+x@sB{E-@bz}~u%~=R>u+7>JjQO!qs`m1jODt1 zY2p4d;}A9{sNS+3HMxL0xUv!^j4^qRHp<2^u!l?9k^{@0g3aiOVFiIin*gCDEH<+g MHQG;f^mq^I58g*7vj6}9 literal 93645 zcmeFZi942U7d=d5o~`giK{h znMug(Tj%rse#iGee8=}5&wEri_kCa2d7gXkwbxqv3eq~I&dk8aKtVyleEgW|848MZ zh7=T(iF7o0<@#yf{rH30S^2mw9sYNd?m{5`P495b$eDtIX(RbRrBcK`O1#MHa@5d8 z$Nr*=tGSaEg{!NpxXo2NXG?PjD{*@#>-Y(IJ_?F06vtJM=(;@``+nn`uGNy#RO6@I zkEL5R*1ZUP_CZ*5r>K5%M(m}F;tK`&3Pz_36|NTEyEqYT6L&H8r+)CWUE({pZV3tY z2^JRF8SmVK3pD$$Lzw@NC-JTGIKYScGTe4^EUd--%z6b-(Q(& z#mHYI_Y8PflRwj}Hs${Jk@=xi-2Z)av}2hCK9A?C6pJDG)6%$xGKBo8SubZs{tUI@ z{r^AY|08Si`1cAmkEIv$?%lf!-n~n4{{6Y){o{kzDpJ%V?nXxX)<4`k(44AKaC1Sb z`RiA01A~9X2~w7!E0#DTW9tXU#zHqAx?WaQMJ+Bap8NXs(UT{cuYND`Z)wpzSM0`q z$aTU`Rrtv7&yT;9c(`iDNz*?+`&P}!h*wHV>TY~|h>*&i!y=Iila=P7d0w12Z6%4N ztBZEj)YOMhpJr`sZ6)7pVPSFi?p^PvPq#gN`n0UQoku`G;8JTQS7>NxVtP7lkm|a# zXV1D!bn}jPy{*NyN_xzV{q~d#m7I&HpbW{|_~4v)ZQOplT-#RBnV~N#?Y}<7`d%OJ z?E6vTap`MXm{#kF`HWo3uQ z6*IH44j|Inb$Y$4+Zj)otY@Ui%*-^qbSdMyAl~cl?%sLJmV5zX7(b6>(AR0*^@6

$b0!9vRSjy;`mfAaG)kL8~K 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 $?3^R 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 F{{b07$`t?r diff --git a/raydeon/src/camera.rs b/raydeon/src/camera.rs index e089863..ffbf660 100644 --- a/raydeon/src/camera.rs +++ b/raydeon/src/camera.rs @@ -1,5 +1,5 @@ use bon::Builder; -use euclid::{Point3D, Transform3D}; +use euclid::{Point3D, Transform3D, Vector3D}; use path::SlicedSegment3D; use self::view_matrix_settings::*; @@ -45,6 +45,22 @@ impl Default for CameraOptions { } impl Camera { + pub fn adjust_yaw(&mut self, yaw: euclid::Angle) { + self.observation.adjust_yaw(yaw); + } + + pub fn adjust_pitch(&mut self, pitch: euclid::Angle) { + self.observation.adjust_pitch(pitch); + } + + pub fn adjust_roll(&mut self, roll: euclid::Angle) { + self.observation.adjust_roll(roll); + } + + pub fn translate(&mut self, trans: impl Into>) { + self.observation.translate(trans); + } + #[must_use] pub fn canvas_transformation(&self) -> Transform3D { let p = &self.perspective; @@ -52,7 +68,7 @@ impl Camera { let xmax = ymax * p.aspect; let frustum = frustum(-xmax, xmax, -ymax, ymax, p.znear, p.zfar); - self.observation.look_matrix().then(&frustum) + self.observation.world_to_camera_transform().then(&frustum) } #[must_use] @@ -114,8 +130,8 @@ impl Camera { .unwrap(); Ray { - point: self.observation.eye, - dir: (world_coord.to_vector() - self.observation.eye.to_vector()).normalize(), + point: self.observation.eye(), + dir: (world_coord.to_vector() - self.observation.eye().to_vector()).normalize(), } } @@ -141,11 +157,7 @@ impl Camera { center: impl Into, up: impl Into, ) -> Observation { - let eye = eye.into(); - let center = center.into(); - let up = up.into().normalize(); - - Observation { eye, center, up } + Observation::look_at(eye, center, up) } pub fn perspective( @@ -172,9 +184,7 @@ mod view_matrix_settings { #[derive(Debug, Copy, Clone)] pub struct Observation { - pub eye: WPoint3, - pub center: WVec3, - pub up: WVec3, + view_mat: CWTransform, } impl Default for Observation { @@ -189,34 +199,81 @@ mod view_matrix_settings { center: impl Into, up: impl Into, ) -> Self { + let view_mat = Self::create_view_matrix(eye, center, up); + Self { view_mat } + } + + pub fn eye(&self) -> WPoint3 { + (self.view_mat.m41, self.view_mat.m42, self.view_mat.m43).into() + } + + pub fn right(&self) -> WVec3 { + (self.view_mat.m11, self.view_mat.m12, self.view_mat.m13).into() + } + + pub fn up(&self) -> WVec3 { + (self.view_mat.m21, self.view_mat.m22, self.view_mat.m23).into() + } + + pub fn look(&self) -> WVec3 { + (-self.view_mat.m31, -self.view_mat.m32, -self.view_mat.m33).into() + } + + fn rotate_around_axis(&mut self, axis: impl Into, angle: euclid::Angle) { + let axis = axis.into(); + self.view_mat = self + .view_mat + .pre_rotate(axis.x, axis.y, axis.z, angle) + .with_destination(); + } + + pub fn adjust_yaw(&mut self, yaw: euclid::Angle) { + self.rotate_around_axis((0.0, 1.0, 0.0), yaw); + } + + pub fn adjust_pitch(&mut self, pitch: euclid::Angle) { + self.rotate_around_axis((1.0, 0.0, 0.0), pitch); + } + + pub fn adjust_roll(&mut self, roll: euclid::Angle) { + self.rotate_around_axis((0.0, 0.0, 1.0), roll); + } + + pub fn translate(&mut self, trans: impl Into>) { + // input is a camera translation, but we're describing a + // world translation, so we negate + let trans = trans.into(); + self.view_mat = self + .view_mat + .pre_translate(trans.cast_unit()) + .with_destination(); + } + + #[rustfmt::skip] + fn create_view_matrix( + eye: impl Into, + center: impl Into, + up: impl Into, + ) -> Transform3D { let eye = eye.into(); let center = center.into(); let up = up.into().normalize(); - Self { eye, center, up } - } + let f = (center - eye.to_vector()).normalize(); + let s = f.cross(up).normalize(); + let u = s.cross(f).normalize(); - #[rustfmt::skip] - pub fn look_matrix(&self) -> WCTransform { - let Observation { eye, center, up, .. } = *self; - let f = (center - eye.to_vector()).normalize(); - let s = f.cross(up).normalize(); - let u = s.cross(f).normalize(); - - CWTransform::from_array( - // euclid used to let us specify things in column major order and now it doesn't. - // So we're just transposing it here. CWTransform::new( - s.x, u.x, -f.x, eye.x, - s.y, u.y, -f.y, eye.y, - s.z, u.z, -f.z, eye.z, - 0.0, 0.0, 0.0, 1.0, + s.x, s.y, s.z, 0.0, + u.x, u.y, u.z, 0.0, + -f.x, -f.y, -f.z, 0.0, + eye.x, eye.y, eye.z, 1.0 ) - .to_array_transposed(), - ) - .inverse() - .unwrap() - } + } + + pub(super) fn world_to_camera_transform(&self) -> WCTransform { + self.view_mat.inverse().unwrap() + } } #[derive(Debug, Copy, Clone)] diff --git a/raydeon/src/scene.rs b/raydeon/src/scene.rs index a8ebc87..a025f2e 100644 --- a/raydeon/src/scene.rs +++ b/raydeon/src/scene.rs @@ -1,7 +1,7 @@ use bon::Builder; use bvh::{BVHTree, Collidable}; use collision::Continuous; -use euclid::{Point2D, Vector2D}; +use euclid::{Point2D, Vector2D, Vector3D}; use path::{LineSegment2D, SlicedSegment3D}; use rand::distributions::Distribution; use rand::SeedableRng; @@ -200,6 +200,22 @@ impl<'s> SceneCamera<'s> { self } + pub fn adjust_yaw(&mut self, yaw: euclid::Angle) { + self.camera.adjust_yaw(yaw); + } + + pub fn adjust_pitch(&mut self, pitch: euclid::Angle) { + self.camera.adjust_pitch(pitch); + } + + pub fn adjust_roll(&mut self, roll: euclid::Angle) { + self.camera.adjust_roll(roll); + } + + pub fn translate(&mut self, trans: impl Into>) { + self.camera.translate(trans); + } + fn geometry_paths(&self) -> Vec> { self.scene .geometry @@ -215,7 +231,7 @@ impl<'s> SceneCamera<'s> { fn clip_filter(&self, path: &LineSegment3D) -> bool { self.scene - .visible(self.camera.observation.eye, path.midpoint()) + .visible(self.camera.observation.eye(), path.midpoint()) } pub fn render(&self) -> Vec> { @@ -254,7 +270,7 @@ impl<'s> SceneCamera<'s> { .subsegments() .enumerate() .filter_map(|(ndx, path)| { - let from_cam = path.midpoint() - self.camera.observation.eye; + let from_cam = path.midpoint() - self.camera.observation.eye(); let close_enough = from_cam.length() < self.camera.perspective.zfar; let visible = close_enough && self.clip_filter(&path); (!visible).then_some(ndx)