TBN matrix in learnopengl

Started by
3 comments, last by Zakwayda 4 years, 8 months ago

Hello.

These is an article about normal mapping - https://learnopengl.com/Advanced-Lighting/Normal-Mapping

The  author is creating TBN matrix where each vector corresponds to R, G, B or X, Y, Z vector. AFAIK these vectors are x - "right", y - "up", z - "dir" and in order to build a matrix from them we must place them in that exact order - first "right", second "up", third "dir". But the author says that normal vector is "up" for some reason.  Why is normal vector not "dir" since it's last in the TBN?"

 

Quote from the article -

Quote

We already know the up vector which is the surface's normal vector. The right and forward vector are the tangent and bitangent vector respectively. The following image of a surface shows all three vectors on a surface:

But he constructs matrix  as mat3(T, B, N). I don't understand why N is called "up" whereas it should be "dir" to my mind.

Advertisement

I didn't read the whole article, but I'll mention that there's no rule regarding which vector in an orthonormal basis is 'up'. This, for example:

Quote

...x - "right", y - "up", z - "dir"...

Is only one of various possible conventions. For example, you could instead use the convention of z = up, y = forward, and x = right or left (depending on handedness).

I did see that the article refers to another related tutorial about cameras, and it looks like in that tutorial y is up and +/-z is forward. Once again though, that's just a convention, and just because y is 'up' in one context doesn't mean it has to be 'up' in another.

Lastly, I'll again offer the disclaimer that I didn't read the whole article and may be missing relevant context. If so, maybe someone else will jump in and provide a better answer.

Hello Zakwayda.

Yes, i understand this thing is convention.

But I think in opengl the convention is to have side, up, forward like here - https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml

glm::LookAt also has same convention. It would be strange to do it differently.

1 hour ago, _Flame_ said:

Yes, i understand this thing is convention.

But I think in opengl the convention is to have side, up, forward like here - https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml

glm::LookAt also has same convention. It would be strange to do it differently.

Certain coordinate spaces in the OpenGL pipeline incorporate certain conventions/expectations, and functions like gluLookAt() and similar functions in GLM reflect that inasmuch as their purpose is to transform geometry into such spaces. But outside of those parts of the pipeline, what convention to use is up to you. In world space, for example, both y-up and z-up are common conventions, and I'd argue that neither is any 'stranger' than the other (although people can certainly have strong opinions on the matter, as is often the case when conventions come into play).

As for your original question, there are others here more qualified to comment on that specific issue, but my intuition is that there's no 'necessary' mapping between 'side, up, and direction/forward' and 'T, B, and N'. For example, this tutorial:

http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/

Seems to refer to x as right and y as up based on how they tend to be oriented in the plane of the texture, while calling z 'outside' (and not, for example, 'direction' or 'forward'). The tutorial you linked to, on the other hand, describes the normal direction as 'up', and since the normal is assigned to the z vector, that makes z up.

I'm happy to be corrected (and maybe someone will do so), but I think the question of which direction is 'up' is purely a matter of convention here (as, I think, the two tutorials mentioned above demonstrate, given that they appear to use different conventions for this). In summary (assuming I'm correct about all this) it's perfectly fine to call z 'up' in a TBN basis.

This topic is closed to new replies.

Advertisement