53 lines
1.8 KiB
Rust
53 lines
1.8 KiB
Rust
use write_file_util::{write_image};
|
|
|
|
use crate::image::{gen_ray_sphere_normal_ppm_p3};
|
|
use crate::types_defined::{Point, Vec3};
|
|
mod image;
|
|
mod write_file_util;
|
|
mod vec3;
|
|
mod ray;
|
|
mod hittable;
|
|
mod sphere;
|
|
mod types_defined;
|
|
mod color;
|
|
|
|
fn main() {
|
|
ray_sphere_normal_scene_render();
|
|
}
|
|
|
|
|
|
fn ray_sphere_normal_scene_render() {
|
|
let aspect_ratio = 16.0/9.0;
|
|
let image_width = 400;
|
|
// aleast 1px
|
|
let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1);
|
|
|
|
let viewport_height = 2.0;
|
|
let viewport_width = viewport_height * (image_width as f32 / image_height as f32);
|
|
|
|
println!("set image({},{}), viewport({},{})", image_width, image_height, viewport_width, viewport_height);
|
|
let viewport_u = Vec3::new(viewport_width, 0.0, 0.0);
|
|
// image x--> right
|
|
// |
|
|
// y
|
|
// space: y up , x right , z back, -z front
|
|
let viewport_v = Vec3::new(0.0, -viewport_height, 0.0);
|
|
|
|
// width per pix
|
|
let viewport_u_delta = viewport_u / (image_width as f32);
|
|
// height per pix
|
|
let viewport_v_delta = viewport_v / (image_height as f32);
|
|
|
|
// camerea position
|
|
let camera_center = Point::new(0.0, 0.0, 0.0);
|
|
// -z 1.0 viewport to camera
|
|
let focal_length = Vec3::new(0.0, 0.0, -1.0);
|
|
// camera position --> viewport center ---> top center --> top left
|
|
let viewport_top_left_pixel = camera_center + 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;
|
|
|
|
let ppm_content = gen_ray_sphere_normal_ppm_p3(image_width, image_height, camera_center, viewport_top_left_pixel_center, viewport_u_delta, viewport_v_delta);
|
|
|
|
write_image(ppm_content, "./target/ray_sphere_normal_scene_render.ppm".to_string())
|
|
} |