Skip to content
TheHellBox edited this page May 6, 2019 · 2 revisions

A few examples of basic OpenXR math

Projection from FOV

fn projection_opengl(left: f32, right: f32, up: f32, down: f32, znear: f32) -> Matrix4<f32> {
    let tan_angle_width = right - left;
    let tan_angle_height = up - down;

    let half_width = 2.0 / tan_angle_width;
    let half_height = 2.0 / tan_angle_height;

    Matrix4::new(
        half_width,
        0.0,
        (right + left) / tan_angle_width,
        0.0,

        0.0,
        half_height,
        (up + down) / tan_angle_height,
        0.0,

        0.0,
        0.0,
        -1.0,
        -(znear * 2.0),

        0.0,
        0.0,
        -1.0,
        0.0,
    )
}

pub fn projection_opengl_fov(fov: xr::Fovf, znear: f32) -> Projective3<f32> {
    let tan_left = fov.angle_left.tan();
    let tan_right = fov.angle_right.tan();
    let tan_up = fov.angle_up.tan();
    let tan_down = fov.angle_down.tan();
    projection_opengl(tan_left, tan_right, tan_up, tan_down, znear)
}

View

pub fn view(position: xr::Vector3f, orientation: xr::Quaternionf) -> Matrix4<f32> {
    let position: Vector3<f32> = position.into();
    let position = Translation3::from(position);

    let orientation: UnitQuaternion<f32> = orientation.into();

    let translation_matrix = position.to_homogeneous();
    let orientation_matrix = orientation.to_homogeneous();
    translation_matrix * orientation_matrix
}

Clone this wiki locally