bitshifter / glam-rs

A simple and fast linear algebra library for games and graphics
Apache License 2.0
1.55k stars 159 forks source link

Improve projection matrix constructors #569

Open kovaxis opened 1 month ago

kovaxis commented 1 month ago

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:

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.

bitshifter commented 3 weeks ago

Leaving this open as while the existing docs have been improved I want to consider moving the projection matrix methods out of Mat4 and DMat4 entirely. There are a lot of combinations, most project will only use one variant of these, e.g. rh_vk or lh_dx or whatever naming gets used, so ideally a project would use the variant they need at never see the rest.

Separate to projection matrix creation, there are a bunch of other methods that have lh and rh variants (e..g. look_at_lh) which could perhaps also be grouped with other lh or rh methods so only relevant methods are imported into a project, although for those it's probably best if they are still methods on types which would mean using traits, which I'm a bit less keen on.

aloucks commented 1 week ago

although for those it's probably best if they are still methods on types which would mean using traits, which I'm a bit less keen on.

Please, no traits.

kovaxis commented 1 week ago

Although there's precedent in the Swizzle traits.