glam-rs icon indicating copy to clipboard operation
glam-rs copied to clipboard

Improve documentation for projection matrix constructors

Open kovaxis opened this issue 4 months ago • 0 comments

Hello! I got very confused choosing the proper Mat4::perspective_* function. I think they could be documented a lot better. In particular, listing from what coordinate system they are mapping from, and into what coordinate system they are mapping into.

I've now done the research, and the transformations are:

perspective_rh_gl: X+ right, Y+ up, Z+ out of screen -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [-1, 1]
perspective_rh:    X+ right, Y+ up, Z+ out of screen -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [0, 1]
perspective_lh:    X+ right, Y+ up, Z+ into screen   -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [0, 1]

Where OpenGL uses Z+ into screen [-1, 1], Metal/DirectX/WebGPU use Z+ into screen [0, 1] and Vulkan uses Y+ down, Z+ into screen [0, 1].

The same issue applies to orthographic projections.

I propose the following to avoid breaking changes:

  • Add perspective_rh_vk and orthographic_rh_vk functions, that map from X+ right, Y+ up, Z+ out of screen to Y+ down, Z+ into screen [0, 1] (what Vulkan expects).
  • Document all of the projection functions with their corresponding modelview-coordinate-system -> graphics-api pairs.
    • perspective_rh_gl: Z+ out of screen -> GL
    • perspective_rh_vk: Z+ out of screen -> VK
    • perspective_rh: Z+ out of screen -> Metal/DX/WGPU
    • perspective_lh: Z+ into screen -> Metal/DX/WGPU
    • Corresponding orthographic functions.
  • Further document the perspective_infinite and perspective_infinite_reverse.

There would be no Z+ into screen -> VK, just like currently there is no Z+ into screen -> GL. Maybe those two could be added? (perspective_lh_gl, perspective_lh_vk).

Actually, I collected my thoughts while writing this issue and I think I'll write up a PR.

kovaxis avatar Oct 16 '24 20:10 kovaxis