Tweak the camera transforms in the 3D view

This commit is contained in:
Patrick Walton 2019-02-22 11:54:01 -08:00
parent 0da196aa92
commit e10e2e97d4
2 changed files with 30 additions and 16 deletions

View File

@ -51,20 +51,22 @@ const MAIN_FRAMEBUFFER_WIDTH: u32 = 1067;
const MAIN_FRAMEBUFFER_HEIGHT: u32 = 800;
const MOUSELOOK_ROTATION_SPEED: f32 = 0.007;
const CAMERA_VELOCITY: f32 = 25.0;
const CAMERA_VELOCITY: f32 = 1000.0;
// How much the scene is scaled when a scale gesture is performed.
const CAMERA_SCALE_SPEED_2D: f32 = 2.0;
// How much the scene is scaled when a zoom button is clicked.
const CAMERA_ZOOM_AMOUNT_2D: f32 = 0.1;
const NEAR_CLIP_PLANE: f32 = 0.01;
const FAR_CLIP_PLANE: f32 = 10.0;
const BACKGROUND_COLOR: ColorU = ColorU { r: 32, g: 32, b: 32, a: 255 };
const GROUND_SOLID_COLOR: ColorU = ColorU { r: 80, g: 80, b: 80, a: 255 };
const GROUND_LINE_COLOR: ColorU = ColorU { r: 127, g: 127, b: 127, a: 255 };
const APPROX_FONT_SIZE: f32 = 16.0;
const GROUND_SCALE: f32 = 0.0015;
const GRIDLINE_COUNT: u8 = 10;
mod ui;
@ -281,25 +283,29 @@ impl DemoApp {
}
Event::KeyDown { keycode: Some(Keycode::W), .. } => {
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
velocity.set_z(-CAMERA_VELOCITY);
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
velocity.set_z(-CAMERA_VELOCITY * scale_factor);
self.dirty = true;
}
}
Event::KeyDown { keycode: Some(Keycode::S), .. } => {
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
velocity.set_z(CAMERA_VELOCITY);
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
velocity.set_z(CAMERA_VELOCITY * scale_factor);
self.dirty = true;
}
}
Event::KeyDown { keycode: Some(Keycode::A), .. } => {
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
velocity.set_x(-CAMERA_VELOCITY);
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
velocity.set_x(-CAMERA_VELOCITY * scale_factor);
self.dirty = true;
}
}
Event::KeyDown { keycode: Some(Keycode::D), .. } => {
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
velocity.set_x(CAMERA_VELOCITY);
let scale_factor = scale_factor_for_view_box(self.scene_view_box);
velocity.set_x(CAMERA_VELOCITY * scale_factor);
self.dirty = true;
}
}
@ -382,11 +388,17 @@ impl DemoApp {
RenderTransform::Perspective(perspective) => perspective,
};
let ground_scale = GROUND_SCALE / scale_factor_for_view_box(self.scene_view_box);
let ground_scale = self.scene_view_box.max_x() * 2.0;
let mut base_transform = perspective.transform;
base_transform = base_transform.post_mul(&Transform3DF32::from_translation(
-0.5 * self.scene_view_box.max_x(),
self.scene_view_box.max_y(),
-0.5 * ground_scale));
unsafe {
// Use the stencil buffer to avoid Z-fighting with the gridlines.
let mut transform = perspective.transform;
let mut transform = base_transform;
let gridline_scale = ground_scale / GRIDLINE_COUNT as f32;
transform = transform.post_mul(&Transform3DF32::from_scale(gridline_scale,
1.0,
@ -415,7 +427,7 @@ impl DemoApp {
gl::Disable(gl::DEPTH_TEST);
gl::Disable(gl::STENCIL_TEST);
let mut transform = perspective.transform;
let mut transform = base_transform;
transform =
transform.post_mul(&Transform3DF32::from_scale(ground_scale, 1.0, ground_scale));
gl::BindVertexArray(self.ground_solid_vertex_array.vertex_array.gl_vertex_array);
@ -743,11 +755,15 @@ struct CameraTransform3D {
impl CameraTransform3D {
fn new(view_box: RectF32) -> CameraTransform3D {
let scale = scale_factor_for_view_box(view_box);
CameraTransform3D {
position: Point3DF32::new(0.0, 0.0, 3000.0, 1.0),
position: Point3DF32::new(0.5 * view_box.max_x(),
-0.5 * view_box.max_y(),
1.5 / scale,
1.0),
yaw: 0.0,
pitch: 0.0,
scale: scale_factor_for_view_box(view_box),
scale,
}
}
@ -762,7 +778,8 @@ impl CameraTransform3D {
fn to_perspective(&self, drawable_size: Point2DI32) -> Perspective {
let aspect = drawable_size.x() as f32 / drawable_size.y() as f32;
let mut transform = Transform3DF32::from_perspective(FRAC_PI_4, aspect, 0.025, 100.0);
let mut transform =
Transform3DF32::from_perspective(FRAC_PI_4, aspect, NEAR_CLIP_PLANE, FAR_CLIP_PLANE);
transform = transform.post_mul(&Transform3DF32::from_rotation(self.yaw, self.pitch, 0.0));
transform = transform.post_mul(&Transform3DF32::from_uniform_scale(2.0 * self.scale));
@ -772,9 +789,6 @@ impl CameraTransform3D {
// Flip Y.
transform = transform.post_mul(&Transform3DF32::from_scale(1.0, -1.0, 1.0));
transform = transform.post_mul(&Transform3DF32::from_translation(0.0,
-1.0 / self.scale,
0.0));
Perspective::new(&transform, drawable_size)
}

View File

@ -17,5 +17,5 @@ uniform mat4 uTransform;
in vec2 aPosition;
void main() {
gl_Position = uTransform * vec4(aPosition.x * 800.0, -30.0, aPosition.y * 800.0, 1.0);
gl_Position = uTransform * vec4(aPosition.x, 0.0, aPosition.y, 1.0);
}