According to a book *Physically Based Rendering: From Theory to Implementation.* By Matt Pharr, Greg Humphreys (link, p. 86-87),

surface **tangent vectors** are transformed as common vectors, using transformation matrix **M**, but

surface **normal vectors** are transformed using .

I wonder why scaling does make a normal incorrect, but doesn't touch a tangent vector? Why are normals so special?

See the figure from the book.

I have read that such transformation for normal is needed to maintain orthogonality of the normal and tangent. But I'd like to get some intuitive explanation.

# Best How To :

Theoretically normals are not really vectors, they are really best though of as bivectors, it just so happens that in 3D both vectors and bivector have three components so it is common to identify they two. If we lived in a four dimensional world we would not have this confusion. There vectors would have 4 components and and bivectors 6 components.

There is a subtle difference between bivectors and pseudovectors/axial-vectors. If **i**, **j**, **k** are your basis elements for vectors then bivectors have basis **j**^**k**, **i**^**k** and **i**^**j**, the Hodge Dual maps one set onto to the other and sends bi-vectors to pseudovectors. Bivectors can be though of as always being the cross product of two other vectors.

If you think of normals as always being the cross product of some pair of tangent vectors you can find how the normal transforms by first transforming the two tangent vectors and then taking their cross product.

Lets think of the diagram in the question as being a slice through a cylinder. In the first picture when the cross-section in a circle two tangent vectors are `(1/rt2, 1/rt2, 0)`

and `(0,0,1)`

where rt2 = sqrt(2). Taking the cross product gives

```
( 1/rt2 ) ( 0 ) ( 1/rt2 )
( 1/rt2 ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
```

the normal. Now apply a squeeze (x,y,z) -> (x, y/2, z), the tangent vectors transform to give `(1/rt2, 1/(2 rt2), 0)`

and `(0,0,1)`

. Take the cross product

```
( 1/rt2 ) ( 0 ) ( 1/(2 rt2) )
( 1/(2 rt2) ) X ( 0 ) = ( -1/rt2 )
( 0 ) ( 1 ) ( 0 )
```

And normalise to give `( 1/sqrt(5), -2/sqrt(5), 0 )`

.

It does not matter which pair of tangent vectors we choose, we will still get the same result. The above calculation is a bit long winded and involves finding a suitable pair of tangent vectors. It simpler to just use the transpose of the inverse matrix.