TransWikia.com

Why negate z when constructing projection matrix OpenGL

Computer Graphics Asked on August 27, 2021

I constructed an orthographic projection matrix from this article on scratchpixel.com:

Matrix4 ortho(float l, float r, float b, float t, float n, float f) {
   return Matrix4(
       2/(r-l), 0, 0, -(r+l)/(r-l), //row 0
       0, 2/(t-b), 0, -(t+b)/(t-b), //row 1
       0, 0, -2/(f-n), -(f+n)/(f-n), //row 2
       0, 0, 0, 1 //row 3
   );
}

, where r, l, t, b, n, f are right, left, top, bottom, near and far corners of the view box.

Now I tested out this matrix using the default parameters of the view box ortho(-1, 1, -1, 1, -1, 1) to see if I get an identity matrix. However I’m getting:

 1, 0, 0, 0,
 0, 1, 0, 0,
 0, 0, -1, 0,
 0, 0, 0, 1

Basically this will result in z coordinate of every transformed point to be negated.

Is it standard to negate the z coordinate when constructing projection matrix? What could be the purpose behind that?

2 Answers

What could be the purpose behind that?

Have a look at the first lines and the first image in the Perspective Projection section of this link. For the answer to your question, it is not important that you used an orthographic projection, even though there is also a corresponding section in the link.

The issue is how OpenGL defines its coordinate systems. Quote from the link:

Note that the eye coordinates are defined in the right-handed coordinate system, but NDC uses the left-handed coordinate system. That is, the camera at the origin is looking along -Z axis in eye space, but it is looking along +Z axis in NDC.

So if you transform between them, you need to swap the z-axis. This is the whole purpose behind it, switching the handedness of the coordinate systems.

Is it standard to negate the z coordinate when constructing projection matrix?

Depends on your API and how the coordinate systems are defined. In OpenGL, you need to do this.

Answered by wychmaster on August 27, 2021

I'm assuming your scene is constructed based on right-handed coordinates.

If you are using OpenGL, yes. If you are using Direct3D, no.

The projection matrix maps [-n, -f] into [0, 1]. This weird property comes from the fact that the eye coordinates are right-handed, but the clip space (NDC) uses left-handed coordinates. Hence the implementation of ortho().

Direct3D uses a z-axis that goes outwards the screen. Implementations for Direct3D projection matrices will not produce negated z when coupled with your application.

Answered by intergula on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP