pub struct Viewport {
pub camera_transform: Transform3D,
pub fov: f64,
pub canvas_centre: Vec2D,
pub objects: Vec<Mesh3D>,
pub display_mode: DisplayMode,
pub character_width_multiplier: f64,
pub clipping_distace: f64,
}
Expand description
The Viewport
handles drawing 3D objects to a 2D Canvas
, and also acts as the scene’s camera.
Fields§
§camera_transform: Transform3D
This transform is applied to every vertex in the scene. Transform3D::look_at_lh
works best for this
fov: f64
The Viewport’s field of view, in degrees
canvas_centre: Vec2D
The centre of the view you intend to draw to. View.centre()
returns exactly what you need for this
objects: Vec<Mesh3D>
The objects to be drawn on the screen
display_mode: DisplayMode
The style in which the objects should be rendered. Read DisplayMode
for more info
character_width_multiplier: f64
Most terminals don’t have perfectly square characters. The value you set here is how much the final image will be stretched in the X axis to account for this. The default value is 2.0
but it will be different in most terminals
clipping_distace: f64
Any face with vertices closer to the viewport than this value will be clipped
Implementations§
Source§impl Viewport
impl Viewport
Sourcepub const fn new(
camera_transform: Transform3D,
fov: f64,
canvas_centre: Vec2D,
) -> Self
pub const fn new( camera_transform: Transform3D, fov: f64, canvas_centre: Vec2D, ) -> Self
Create a new Viewport
Examples found in repository?
13fn main() {
14 let mut view = View::new(100, 45, ColChar::EMPTY);
15 let mut viewport = Viewport::new(
16 Transform3D::look_at_lh(Vec3D::new(0.0, -3.0, 6.0), Vec3D::ZERO, Vec3D::Y),
17 FOV,
18 view.center(),
19 );
20
21 viewport.display_mode = DisplayMode::Illuminated {
22 lights: vec![
23 Light::new_ambient(0.3),
24 Light::new_directional(0.7, Vec3D::new(1.0, 1.0, 1.0)),
25 ],
26 };
27
28 viewport.objects.push(Mesh3D::torus(1.8, 1.0, 32, 16));
29
30 loop {
31 let donut_tr = &mut viewport.objects[0].transform;
32 *donut_tr = donut_tr.mul_mat4(&Transform3D::from_rotation_y(-0.03));
33 *donut_tr = donut_tr.mul_mat4(&Transform3D::from_rotation_x(0.03));
34
35 view.clear();
36 view.draw(&viewport);
37 let _ = view.display_render();
38
39 thread::sleep(Duration::from_secs_f32(1.0 / FPS));
40 }
41}
More examples
14fn main() {
15 let mut view = View::new(100, 50, ColChar::EMPTY);
16
17 let mut viewport = Viewport::new(
18 Transform3D::look_at_lh(Vec3D::new(0.0, -1.5, 4.3), Vec3D::ZERO, Vec3D::Y),
19 FOV,
20 view.center(),
21 );
22 viewport.objects.push(Mesh3D::default_cube());
23
24 viewport.display_mode = DisplayMode::Illuminated {
25 lights: vec![
26 Light::new_ambient(0.3),
27 Light::new_directional(0.6, Vec3D::new(0.5, 1.0, 1.0)),
28 ],
29 };
30
31 fps_gameloop!(
32 {
33 viewport.objects[0].transform = viewport.objects[0]
34 .transform
35 .mul_mat4(&Transform3D::from_rotation_y(-0.05));
36 },
37 {
38 view.clear();
39 view.draw(&viewport);
40 let _ = view.display_render();
41 },
42 FPS,
43 |elapsed: Duration, frame_skip| {
44 println!(
45 "Elapsed: {:.2?}µs | Frame skip: {}",
46 elapsed.as_micros(),
47 frame_skip
48 );
49 }
50 );
51}