Lerp the initial cameras to get the initial transform

This commit is contained in:
Alan Jeffrey 2019-03-28 11:22:22 -05:00 committed by Josh Matthews
parent 463ea6519b
commit 6642a2ce1e
2 changed files with 16 additions and 27 deletions

View File

@ -39,6 +39,7 @@ pub extern "C" fn magicleap_pathfinder_demo(egl_display: EGLDisplay, egl_context
options.background = Background::None; options.background = Background::None;
options.mode = Mode::VR; options.mode = Mode::VR;
options.jobs = Some(2); options.jobs = Some(2);
options.pipeline = 0;
let mut app = DemoApp::new(window, window_size, options); let mut app = DemoApp::new(window, window_size, options);
debug!("Initialized app"); debug!("Initialized app");

View File

@ -72,16 +72,12 @@ use std::path::PathBuf;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
// How much to predict the next frame based on the current frame and the velocity.
const PREDICTION_FACTOR: f32 = 0.75;
pub struct MagicLeapWindow { pub struct MagicLeapWindow {
framebuffer_id: GLuint, framebuffer_id: GLuint,
graphics_client: MLHandle, graphics_client: MLHandle,
size: Point2DI32, size: Point2DI32,
virtual_camera_array: MLGraphicsVirtualCameraInfoArray, virtual_camera_array: MLGraphicsVirtualCameraInfoArray,
initial_camera_transforms: Option<Vec<Transform3DF32>>, initial_camera_transform: Option<Transform3DF32>,
previous_camera_transforms: Option<Vec<MLTransform>>,
frame_handle: MLHandle, frame_handle: MLHandle,
resource_loader: FilesystemResourceLoader, resource_loader: FilesystemResourceLoader,
pose_event: Option<Vec<CameraTransform>>, pose_event: Option<Vec<CameraTransform>>,
@ -191,8 +187,7 @@ impl MagicLeapWindow {
size: Point2DI32::new(max_width, max_height), size: Point2DI32::new(max_width, max_height),
frame_handle: ML_HANDLE_INVALID, frame_handle: ML_HANDLE_INVALID,
virtual_camera_array, virtual_camera_array,
initial_camera_transforms: None, initial_camera_transform: None,
previous_camera_transforms: None,
resource_loader, resource_loader,
pose_event: None, pose_event: None,
running: true, running: true,
@ -238,29 +233,22 @@ impl MagicLeapWindow {
result.unwrap(); result.unwrap();
} }
let virtual_camera_array = &self.virtual_camera_array; let virtual_camera_array = &self.virtual_camera_array;
let initial_camera = self.initial_camera_transform.get_or_insert_with(|| {
let initial_offset = Transform3DF32::from_translation(0.0, 0.0, 1.0); let initial_offset = Transform3DF32::from_translation(0.0, 0.0, 1.0);
let initial_cameras = self.initial_camera_transforms.get_or_insert_with(|| let mut camera = virtual_camera_array.virtual_cameras[0].transform;
(0..virtual_camera_array.num_virtual_cameras) for i in 1..virtual_camera_array.num_virtual_cameras {
.map(|i| &virtual_camera_array.virtual_cameras[i as usize]) let next = virtual_camera_array.virtual_cameras[i as usize].transform;
.map(|camera| Transform3DF32::from(camera.transform).post_mul(&initial_offset)) camera = camera.lerp(next, 1.0 / (i as f32 + 1.0));
.collect() }
); Transform3DF32::from(camera).post_mul(&initial_offset)
let previous_cameras = self.previous_camera_transforms.get_or_insert_with(|| });
(0..virtual_camera_array.num_virtual_cameras)
.map(|i| virtual_camera_array.virtual_cameras[i as usize].transform)
.collect()
);
let camera_transforms = (0..virtual_camera_array.num_virtual_cameras) let camera_transforms = (0..virtual_camera_array.num_virtual_cameras)
.map(|i| &virtual_camera_array.virtual_cameras[i as usize]) .map(|i| {
.zip(initial_cameras) let camera = &virtual_camera_array.virtual_cameras[i as usize];
.zip(previous_cameras)
.map(|((camera, initial_camera), previous_camera)| {
let predicted_camera = previous_camera.lerp(camera.transform, 1.0 + PREDICTION_FACTOR);
let projection = Transform3DF32::from(camera.projection); let projection = Transform3DF32::from(camera.projection);
let size = RectI32::from(virtual_camera_array.viewport).size(); let size = RectI32::from(virtual_camera_array.viewport).size();
let perspective = Perspective::new(&projection, size); let perspective = Perspective::new(&projection, size);
let view = Transform3DF32::from(predicted_camera).inverse().post_mul(initial_camera); let view = Transform3DF32::from(camera.transform).inverse().post_mul(initial_camera);
*previous_camera = camera.transform;
CameraTransform { perspective, view } CameraTransform { perspective, view }
}) })
.collect(); .collect();