Why are things like lighting normally done in eye coordinates? In my engine, I make sure to seperate the modelview matrix into a viewing matrix and a modelling matrix, and I do all my lighting calculations are done in world space, that is by applying only the modelling matrix.
This is a good question. It really depends on
the space that's convenient for you. The
important thing is to be very consistent in
whatever space you choose.
For example, say you want to do your lighting in
eye space. A typical calculation in any light
model is the diffuse dot product
T
LdotN = (Le - Ve) Ne
where Le is the light position, Ve is the vertex
position, and Ne is the vertex normal, all in
eye space. I've left out the normalization of
Le - Ve for simplicity.
It is helpful to look at the transforms that put
these vectors in eye space to begin with, then
it will become clear why this works.
To transform any vertex into eye space, we
multiply it by the MV (Model and View matrix).
To transform a normal, we multiply it by the
inverse transpose of the same matrix. So our
equation above would expand to
T T -1T
LdotN = (Le - Ve) Ne = (CLw - CMVo) (CM) No
where C is the view matrix (camera C to avoid
confusion with vertex V), M is the model matrix,
Lw is the light position in world space, Vo is
the vertex position in object space, and No is
the vertex normal in object space.
Now, it really helps to know something about
matrices at this point.
T
LdotN = (Le - Ve) Ne eye space
T -1T
= (CLw - CMVo) (CM) No with transforms
T -1T T -1T
= (CLw)((CM) No) - (CMVo)((CM) No) transpose over sum
T T -1T -1T T T T -1T -1T
= Lw C C M No - Vo M C C M No reverse order law
T -1T T
= Lw M No - Vo No simplify
-1 T
= (M Lw - Vo) No simplify
(It's interesting to repeat this with everything
in world space, you'll end up with the same
result.)
This means that evaluating this equation
is eye space is equivalent to moving the light
into object space and evaluating it there. This
is intuitive really, you can move the object
into world space with the light, or move the
light into object space with the model, it's
arbitrary. The important thing is to keep
everything in the same space, or be very
careful when mixing spaces.
Hope this helps.
edit:
made a correction in a simplification
Yeah, I like keeping everything in “world space”, that is where (0, 0, 0) is the center of the “universe,” as opposed to “object space” where (0, 0, 0) is the “center of mass” or “eye space” where (0, 0, 0) is the center of the screen…
I’m well aware of the importance of keeping things consistent, though. If it works… why argue, right?
Right. I like world space too … it just smells better.