Tweak the camera transforms in the 3D view
This commit is contained in:
parent
0da196aa92
commit
e10e2e97d4
|
@ -51,20 +51,22 @@ const MAIN_FRAMEBUFFER_WIDTH: u32 = 1067;
|
||||||
const MAIN_FRAMEBUFFER_HEIGHT: u32 = 800;
|
const MAIN_FRAMEBUFFER_HEIGHT: u32 = 800;
|
||||||
|
|
||||||
const MOUSELOOK_ROTATION_SPEED: f32 = 0.007;
|
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.
|
// How much the scene is scaled when a scale gesture is performed.
|
||||||
const CAMERA_SCALE_SPEED_2D: f32 = 2.0;
|
const CAMERA_SCALE_SPEED_2D: f32 = 2.0;
|
||||||
// How much the scene is scaled when a zoom button is clicked.
|
// How much the scene is scaled when a zoom button is clicked.
|
||||||
const CAMERA_ZOOM_AMOUNT_2D: f32 = 0.1;
|
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 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_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 GROUND_LINE_COLOR: ColorU = ColorU { r: 127, g: 127, b: 127, a: 255 };
|
||||||
|
|
||||||
const APPROX_FONT_SIZE: f32 = 16.0;
|
const APPROX_FONT_SIZE: f32 = 16.0;
|
||||||
|
|
||||||
const GROUND_SCALE: f32 = 0.0015;
|
|
||||||
const GRIDLINE_COUNT: u8 = 10;
|
const GRIDLINE_COUNT: u8 = 10;
|
||||||
|
|
||||||
mod ui;
|
mod ui;
|
||||||
|
@ -281,25 +283,29 @@ impl DemoApp {
|
||||||
}
|
}
|
||||||
Event::KeyDown { keycode: Some(Keycode::W), .. } => {
|
Event::KeyDown { keycode: Some(Keycode::W), .. } => {
|
||||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
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;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::KeyDown { keycode: Some(Keycode::S), .. } => {
|
Event::KeyDown { keycode: Some(Keycode::S), .. } => {
|
||||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
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;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::KeyDown { keycode: Some(Keycode::A), .. } => {
|
Event::KeyDown { keycode: Some(Keycode::A), .. } => {
|
||||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
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;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::KeyDown { keycode: Some(Keycode::D), .. } => {
|
Event::KeyDown { keycode: Some(Keycode::D), .. } => {
|
||||||
if let Camera::ThreeD { ref mut velocity, .. } = self.camera {
|
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;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -382,11 +388,17 @@ impl DemoApp {
|
||||||
RenderTransform::Perspective(perspective) => perspective,
|
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 {
|
unsafe {
|
||||||
// Use the stencil buffer to avoid Z-fighting with the gridlines.
|
// 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;
|
let gridline_scale = ground_scale / GRIDLINE_COUNT as f32;
|
||||||
transform = transform.post_mul(&Transform3DF32::from_scale(gridline_scale,
|
transform = transform.post_mul(&Transform3DF32::from_scale(gridline_scale,
|
||||||
1.0,
|
1.0,
|
||||||
|
@ -415,7 +427,7 @@ impl DemoApp {
|
||||||
gl::Disable(gl::DEPTH_TEST);
|
gl::Disable(gl::DEPTH_TEST);
|
||||||
gl::Disable(gl::STENCIL_TEST);
|
gl::Disable(gl::STENCIL_TEST);
|
||||||
|
|
||||||
let mut transform = perspective.transform;
|
let mut transform = base_transform;
|
||||||
transform =
|
transform =
|
||||||
transform.post_mul(&Transform3DF32::from_scale(ground_scale, 1.0, ground_scale));
|
transform.post_mul(&Transform3DF32::from_scale(ground_scale, 1.0, ground_scale));
|
||||||
gl::BindVertexArray(self.ground_solid_vertex_array.vertex_array.gl_vertex_array);
|
gl::BindVertexArray(self.ground_solid_vertex_array.vertex_array.gl_vertex_array);
|
||||||
|
@ -743,11 +755,15 @@ struct CameraTransform3D {
|
||||||
|
|
||||||
impl CameraTransform3D {
|
impl CameraTransform3D {
|
||||||
fn new(view_box: RectF32) -> CameraTransform3D {
|
fn new(view_box: RectF32) -> CameraTransform3D {
|
||||||
|
let scale = scale_factor_for_view_box(view_box);
|
||||||
CameraTransform3D {
|
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,
|
yaw: 0.0,
|
||||||
pitch: 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 {
|
fn to_perspective(&self, drawable_size: Point2DI32) -> Perspective {
|
||||||
let aspect = drawable_size.x() as f32 / drawable_size.y() as f32;
|
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_rotation(self.yaw, self.pitch, 0.0));
|
||||||
transform = transform.post_mul(&Transform3DF32::from_uniform_scale(2.0 * self.scale));
|
transform = transform.post_mul(&Transform3DF32::from_uniform_scale(2.0 * self.scale));
|
||||||
|
@ -772,9 +789,6 @@ impl CameraTransform3D {
|
||||||
|
|
||||||
// Flip Y.
|
// Flip Y.
|
||||||
transform = transform.post_mul(&Transform3DF32::from_scale(1.0, -1.0, 1.0));
|
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)
|
Perspective::new(&transform, drawable_size)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,5 +17,5 @@ uniform mat4 uTransform;
|
||||||
in vec2 aPosition;
|
in vec2 aPosition;
|
||||||
|
|
||||||
void main() {
|
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue