add Camerax2
This commit is contained in:
parent
59b169507c
commit
8c58296849
|
@ -12,6 +12,22 @@ impl Camera {
|
||||||
let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1);
|
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);
|
let viewport_width = viewport_height * (image_width as f32 / image_height as f32);
|
||||||
|
|
||||||
|
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);
|
||||||
|
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;
|
||||||
|
|
||||||
Camera {
|
Camera {
|
||||||
image_width,
|
image_width,
|
||||||
image_height,
|
image_height,
|
||||||
|
@ -20,26 +36,15 @@ impl Camera {
|
||||||
viewport_height,
|
viewport_height,
|
||||||
camera_center,
|
camera_center,
|
||||||
focal_length,
|
focal_length,
|
||||||
|
viewport_u,
|
||||||
|
viewport_v,
|
||||||
|
viewport_u_delta,
|
||||||
|
viewport_v_delta,
|
||||||
|
viewport_top_left_pixel_center,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(&self, world: &HittableList) -> String {
|
pub fn render(&self, world: &HittableList) -> String {
|
||||||
let viewport_u = Vec3::new(self.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, -self.viewport_height, 0.0);
|
|
||||||
// width per pix
|
|
||||||
let viewport_u_delta = viewport_u / (self.image_width as f32);
|
|
||||||
// height per pix
|
|
||||||
let viewport_v_delta = viewport_v / (self.image_height as f32);
|
|
||||||
let viewport_top_left_pixel =
|
|
||||||
self.camera_center + self.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 mut img_content = format!("P3\n{} {}\n255\n", self.image_width, self.image_height);
|
let mut img_content = format!("P3\n{} {}\n255\n", self.image_width, self.image_height);
|
||||||
|
|
||||||
for j in 0..self.image_height {
|
for j in 0..self.image_height {
|
||||||
|
@ -49,9 +54,9 @@ impl Camera {
|
||||||
|
|
||||||
for i in 0..self.image_width {
|
for i in 0..self.image_width {
|
||||||
// every pixcel's position
|
// every pixcel's position
|
||||||
let pixel_center = viewport_top_left_pixel_center
|
let pixel_center = self.viewport_top_left_pixel_center
|
||||||
+ (i as f32 * viewport_u_delta)
|
+ (i as f32 * self.viewport_u_delta)
|
||||||
+ (j as f32 * viewport_v_delta);
|
+ (j as f32 * self.viewport_v_delta);
|
||||||
// Vector(camera, pixcel)
|
// Vector(camera, pixcel)
|
||||||
let ray_direction = pixel_center - self.camera_center;
|
let ray_direction = pixel_center - self.camera_center;
|
||||||
// ray
|
// ray
|
||||||
|
|
|
@ -36,6 +36,11 @@ pub struct Camera {
|
||||||
pub viewport_height: f32,
|
pub viewport_height: f32,
|
||||||
pub camera_center: Point,
|
pub camera_center: Point,
|
||||||
pub focal_length: Vec3,
|
pub focal_length: Vec3,
|
||||||
|
pub viewport_u: Vec3,
|
||||||
|
pub viewport_v: Vec3,
|
||||||
|
pub viewport_u_delta: Vec3,
|
||||||
|
pub viewport_v_delta: Vec3,
|
||||||
|
pub viewport_top_left_pixel_center: Vec3,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue