diff --git a/Cargo.lock b/Cargo.lock index 65e2074..93ec09d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + [[package]] name = "cfg-if" version = "1.0.1" @@ -10,12 +16,13 @@ checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "getrandom" -version = "0.2.16" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", + "r-efi", "wasi", ] @@ -53,21 +60,26 @@ dependencies = [ ] [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -75,9 +87,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom", ] @@ -108,9 +120,21 @@ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index 29ab145..30e7c82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2024" [dependencies] -rand = "0.8.5" # 使用最新稳定版 \ No newline at end of file +rand = "0.9.2" # 使用最新稳定版 \ No newline at end of file diff --git a/src/camera.rs b/src/camera.rs index 69f2914..61d17d3 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -2,24 +2,30 @@ use std::fs::File; use std::io::{BufWriter}; use crate::hittable::HittableList; -use crate::math_utils::{clamp, near_zero}; +use crate::math_utils::{clamp, degrees_to_radians}; use crate::ppm_writer::PPMWriter; use crate::types_defined::{Camera, Color, HitRecord, Point, Ray, Vec3}; use rand::rngs::ThreadRng; -use rand::{Rng, thread_rng}; +use rand::{Rng, rng}; use crate::material::{Material, MaterialKind}; impl<'a> Camera<'a> { pub fn new( + fov: f32, image_width: i32, aspect_ratio: f32, - viewport_height: f32, camera_center: Point, - focal_length: Vec3, + focal_length: f32, sample_times: i8, reflect_depth: i8, ppm_file_writer: &'a mut PPMWriter> ) -> Self { + + + let theta = degrees_to_radians(fov); + let h = f32::tan(theta / 2.); + let viewport_height = 2. * h * focal_length; + let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1); let viewport_width = viewport_height * (image_width as f32 / image_height as f32); @@ -34,7 +40,7 @@ impl<'a> Camera<'a> { // height per pix let viewport_v_delta = viewport_v / (image_height as f32); let viewport_top_left_pixel = - camera_center - focal_length - viewport_u / 2.0 - viewport_v / 2.0; + camera_center - Vec3::new(0., 0., focal_length) - viewport_u / 2.0 - viewport_v / 2.0; // padding 0.5* delta u/v let viewport_top_left_pixel_center = viewport_top_left_pixel - viewport_u_delta / 2.0 - viewport_v_delta / 2.0; @@ -69,7 +75,7 @@ impl<'a> Camera<'a> { for i in 0..self.image_width { // color let mut color = Color::new(0.0, 0.0, 0.0); - let rng = &mut thread_rng(); + let rng = &mut rng(); for _ in 0..self.sample_times { let bias = self.random_square(rng); let pix_sample = self.viewport_top_left_pixel_center diff --git a/src/main.rs b/src/main.rs index 1f3966c..48bf2f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,11 +22,12 @@ fn main() { fn camera_render() { + let fov: f32 = 90.; let scale = 1; let width: i32 = 800/scale; let height: i32 = 600/scale; - let sample_times = 127; - let reflect_depth = 127; + let sample_times = 20; + let reflect_depth = 20; let pw_r = PPMWriter::new( @@ -40,11 +41,11 @@ fn camera_render() { let mut camera: Camera = Camera::new( + fov, width, width as f32 / height as f32, - 2.0, Point::new(0.0, -0.0, 0.0), - Vec3::new(0.0, 0.0, 1.0), + 1.0, sample_times, reflect_depth, pw diff --git a/src/math_utils.rs b/src/math_utils.rs index d466369..0dc0285 100644 --- a/src/math_utils.rs +++ b/src/math_utils.rs @@ -1,5 +1,11 @@ +use std::f32::consts::PI; + use crate::types_defined::{Ray, Vec3}; +pub fn degrees_to_radians(deg: f32) -> f32 { + deg * PI / 180. +} + pub fn clamp(value: f32, low: f32, high: f32) -> f32 { if value < low { return low;