Skip to main content
gamedev.net
🔒 Locked

Normal vector

Started by Floru 4 replies 2.8k views
Original Post
Floru
Floru
Is there a function to calculate the normal vector for given points (for example 3 points). I''m using Direct3D and I have problems with lightning because I can''t calculate the normal vector. Thanks
Spellbound
Spellbound
You''ll want to use the crossproduct, like so:

VECTOR V1,V2,V3, N;

N = Normalize(CrossProduct(V2-V1,V3-V1));

Remember that the direction of the normal depends on the order of its arguments so you must be consistent in the ordering.
nes8bit
nes8bit
If you don''t want to calculate normals yourself and want dx to calculate lighting and your app is not realtime, then you can use d3ddev.setrenderstate D3DRENDERSTATE_NORMALIZENORMALS, TRUE.
Spellbound
Spellbound
That doesn''t calculate the normals, it only normalizes them.
nes8bit
nes8bit
Doesn''t it do it for lighting only though? Isn''t that the solution to Floru''s problem? It is of course a horrible way to do it.
Spellbound
Spellbound
D3DRENDERSTATE_NORMALIZENORMALS should be set to true as your Direct3D drivers are usually much faster at normalizing than anything you can do yourself (unless you do some insane optimizations ). However, for the lighting to work you have to calculate the direction of the surface normal, and that is computed with the crossproduct as in my above answer.

The D3DRENDERSTATE_NORMALIZENORMALS state is usually used to be able to keep the right magnitude of the normals after transformations, for example scaling.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.