Normals And Lighting

Started by
2 comments, last by haegarr 18 years, 5 months ago
Hey there guys. Is there anybody who could give me a quick overview of how to determine the normal of a vertex so that the lighting in DirectX treats it properly. Say I have a cube that is defined as: g_Building[0].position = D3DXVECTOR3(-1.0f, 1.0f,-1.0f); g_Building[1].position = D3DXVECTOR3( 1.0f, 1.0f,-1.0f); g_Building[2].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f); g_Building[3].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f); g_Building[4].position = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); g_Building[5].position = D3DXVECTOR3(-1.0f,-1.0f, 1.0f); g_Building[6].position = D3DXVECTOR3( 1.0f, 1.0f, 1.0f); g_Building[7].position = D3DXVECTOR3( 1.0f,-1.0f, 1.0f); g_Building[8].position = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); g_Building[9].position = D3DXVECTOR3( 1.0f, 1.0f, 1.0f); g_Building[10].position = D3DXVECTOR3(-1.0f, 1.0f,-1.0f); g_Building[11].position = D3DXVECTOR3( 1.0f, 1.0f,-1.0f); g_Building[12].position = D3DXVECTOR3(-1.0f,-1.0f, 1.0f); g_Building[13].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f); g_Building[14].position = D3DXVECTOR3( 1.0f,-1.0f, 1.0f); g_Building[15].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f); g_Building[16].position = D3DXVECTOR3( 1.0f, 1.0f,-1.0f); g_Building[17].position = D3DXVECTOR3( 1.0f, 1.0f, 1.0f); g_Building[18].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f); g_Building[19].position = D3DXVECTOR3( 1.0f,-1.0f, 1.0f); g_Building[20].position = D3DXVECTOR3(-1.0f, 1.0f,-1.0f); g_Building[21].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f); g_Building[22].position = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); g_Building[23].position = D3DXVECTOR3(-1.0f,-1.0f, 1.0f); Where those are the vertecies of the cube (It's using a vertex list, not an index thing) How do I make the light work properly on that? Thanks very muchness...
Pure And Simple Games
Advertisement
Verices by itself have no normals, since they are 1D entities in a 3D world. What one does is to determine the normals of the adjacent faces, to do some computation on it (see below) and to declare the results as the normals of the vertices.

The simplest thing is to assign the normal of the face _as is_ to the vertices of that face. That in fact means that the normal is the same at each place in space covered by the face. Since neighbouring faces in a cube will have their own, distinct normals, the normals change suddenly from face to face, and so the edges and corners appear sharp.

Another basic way is to average the normals of all adjacent faces before assigning them to the respective vertices. In such a case the normals will vary from vertex to vertex. The gfx API is able to interpolate these normals when rendering the face, so that the edges and corners of your cube look something smooth (as long as not looking from the side!).

For a single face you can compute the normal "by hand" or let the API doing it for you. (I think also D3D can compute normals on the fly? Don't know, since I'm an OpenGL user.)

If computing "by hand" one usually computes the cross product of the vectors given by the edges of the face. E.g. for a triangular face with the points A, B, and C:
v := (B-A) x (C-A) ; n := v / |v|
where v is the vector from the cross product, and n (your normal) the normalized v.
For a quadrangular face w/ the points A, B, C, and D (your case), one should use diagonal vectors for this purpose:
v := (C-A) x (D-B) ; n := v / |v|

In all cases (say also if you want your API doing the computations) you have to guarantee the correct order in which vertices are supplied, or else the normals will point into the opposite direction they should. Either supply them all in CW or CCW.
Thanks for that.

When you say (C - A) do you mean the vector CA, as in "From vertex C to vertex A" or are you using some crazy notation for something else?
Pure And Simple Games
Yes, I mean point C minus point A, yielding in the difference vector. In geometric math it is often written as the line AC. (Line A to C is computed as point C minus A, not vice-versa.)

I wrote it w.r.t. a vector algebra that distinguishes explicitely between points and (direction) vectors. I've often answered problems that have arised from not distingushing between these kinds of vectors, since API's can be misunderstood that there is no such difference.

You probably will enter this problem if coming to transformations, where you will notice that there is a difference of transforming points or direction vectors, although the transformation matrices (if used) are the same.

If already interested in more about that, post it here. I'll look at it.

This topic is closed to new replies.

Advertisement