# vertex normals

Started by Jul 12 2001 11:27 PM

,
2 replies to this topic

###
#1
Members - Reputation: **122**

Posted 12 July 2001 - 11:27 PM

Heya,
I''d like to know if there is a shorter way of calculating vertex normals than my idea.
I just imported a md2 (quake2) model into my engine.
Somehow the vertexnormals (which are included in the md2 format)
are not right!
So I want to calculate them myself instead of taking them from the original file.
My formula:
vertexnormal = (trianglenormal1 + trianglenormal2 + ....)/numtriangles_vertex_is_partof;
Since I don''t have trianglenormals either, I have to calculate them first.
That''s why I thought there may be a faster way of doing this.
By the way, my engine is in software, so I have no hardware or D3D features that I can use!
Gr,
BoRReL

###
#2
Members - Reputation: **1377**

Posted 13 July 2001 - 06:39 AM

If all you have is triangles and you want to find vertex normals, then your simple average is the easiest way to do it that I know. There are different kinds of weighted averages, surface fits, etc., but they are more complex than your approach.

Are you certain that the normals out of the md2 file are incorrect? How did you check? (I would have thought that Milkshape or whatever tool you''re using would export them correctly.)

In any case, to find the normal of a triangle, you need to just find the cross product between a vector along one edge and the vector along another edge. Then normalize the resulting cross product vector by dividing by its length. This normalized cross product is a normal to the triangle. Any two edges can be used to find the normal.

Your triangles

Are you certain that the normals out of the md2 file are incorrect? How did you check? (I would have thought that Milkshape or whatever tool you''re using would export them correctly.)

In any case, to find the normal of a triangle, you need to just find the cross product between a vector along one edge and the vector along another edge. Then normalize the resulting cross product vector by dividing by its length. This normalized cross product is a normal to the triangle. Any two edges can be used to find the normal.

Your triangles

**must**be oriented consistently, either all clockwise or all counterclockwise. Otherwise, your average normal will be wrong. Also, since there are two normals (one towards the inside of the surface represented by the triangle, one towards the outside of the surface represented by the triangle), you need to determine which cross product to use to get the outside-pointing normal. (For example, edge 1 cross edge 2 might give the inside normal, while edge 2 cross edge 1 would give the outside normal.)