initial implementation for the off-axis view frustum based on previous code
This commit is contained in:
parent
670e1b1756
commit
10a41fcfce
4 changed files with 118 additions and 76 deletions
|
@ -57,6 +57,61 @@ pub fn make_projection_rh_custom(fov_y: f32, aspect_ratio: f32, z_near: f32, z_f
|
|||
}
|
||||
|
||||
|
||||
fn create_offaxis_matrices(
|
||||
screen_lower_left: Vec3,
|
||||
screen_lower_right: Vec3,
|
||||
screen_upper_left: Vec3,
|
||||
pos_eye: Vec3,
|
||||
z_far: f32
|
||||
) -> (Mat4,Mat4)
|
||||
{
|
||||
|
||||
//
|
||||
let vec_right = screen_lower_right - screen_lower_left; // vr
|
||||
let vec_up = screen_upper_left - screen_lower_left; // vu
|
||||
|
||||
let frustum_left = screen_lower_left - pos_eye; // va
|
||||
let frustum_right = screen_lower_right - pos_eye; // vb
|
||||
let frustum_up = screen_upper_left - pos_eye; // vc
|
||||
|
||||
let vec_right_normalized = vec_right.normalize();
|
||||
let vec_up_normalized = vec_up.normalize();
|
||||
|
||||
let vec_normal = vec_right_normalized.cross(vec_up_normalized).normalize();
|
||||
|
||||
let dist = -vec_right.dot(vec_normal);
|
||||
|
||||
let z_near = 0.001_f32.max(dist - 0.01);
|
||||
|
||||
let left = vec_right.dot(frustum_left) * z_near / dist;
|
||||
let right = vec_right.dot(frustum_right) * z_near / dist;
|
||||
let bottom = vec_up.dot(frustum_left) * z_near / dist;
|
||||
let top = vec_up.dot(frustum_up) * z_near / dist;
|
||||
|
||||
|
||||
let projection_matrix = make_projection_rh_from_frustum_reversed(left,right,bottom,top,z_near,z_far);
|
||||
|
||||
let view_matrix_rotation = Mat4::from_cols(
|
||||
Vec4::new(vec_right.x, vec_up.x, vec_normal.x ,0.0),
|
||||
Vec4::new(vec_right.y, vec_up.y, vec_normal.y ,0.0),
|
||||
Vec4::new(vec_right.z, vec_up.z, vec_normal.z ,0.0),
|
||||
Vec4::W
|
||||
);
|
||||
|
||||
let view_matrix_eye = Mat4::from_cols(
|
||||
Vec4::X,
|
||||
Vec4::Y,
|
||||
Vec4::Z,
|
||||
(-pos_eye).extend(1.0)
|
||||
);
|
||||
|
||||
let view_matrix = view_matrix_rotation * view_matrix_eye;
|
||||
|
||||
(view_matrix,projection_matrix)
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use bevy::prelude::Mat4;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue