**0**

# Computing normals

Started by May 06 2005 09:18 AM

,
4 replies to this topic

###
#1
Banned - Reputation: **592**

Posted 06 May 2005 - 09:18 AM

What I want to do is add a normal calculation into my terrain editor. The normal won't be recorded, but will be converted to a float modifier for vertex color using a static directional light. In other words, I end up with just a float.
What I would like to do is compute the normal of a vertex by using the surrounding vertex positions, rather than computing the normal for a triangle and averaging them out for each vertex. Does that make sense? Is it possible?
My vertices are all aligned on a grid. Each vertex is exactly 32 points distance in the x and z (ground) axes from other vertices. The height of each vertex is really the only contributing change in normals.
Would you simply start each vertex normal as pointed straight up, then average out the other vertex angles related to it? Like if the vertex to the left is lower than the current, the current normal leans left. Then the same for the right vertex, and so on. Add them all together and renormalize?
Any advice?

###
#2
Crossbones+ - Reputation: **2194**

Posted 06 May 2005 - 09:31 AM

you can try and take the two diagonal vectors from neighbouring vertices and cross product those.

E = V[i+1][j+1] - V[i-1][j-1];

F = V[i-1][j+1] - V[i+1][j-1];

N = E x F;

N.Normalise();

with the added extra optimisations, given that it's a regular grid.

E = V[i+1][j+1] - V[i-1][j-1];

F = V[i-1][j+1] - V[i+1][j-1];

N = E x F;

N.Normalise();

with the added extra optimisations, given that it's a regular grid.

###
#3
Banned - Reputation: **592**

Posted 06 May 2005 - 09:53 AM

I can't beleive I haven't rated you until now. I've just been assuming I had you maxed out already. Yet it only gives you four points, so it's like shining your headlights [grin]

I'm curious as to why you chose to cross the diagonal vectors? What about the straight directions? Would there be a problem in using those? I could cross both and average them.

I'll try it and see what happens [smile]

I'm curious as to why you chose to cross the diagonal vectors? What about the straight directions? Would there be a problem in using those? I could cross both and average them.

I'll try it and see what happens [smile]

###
#4
Banned - Reputation: **592**

Posted 06 May 2005 - 10:23 AM

Both are pretty, but the combined normals seem a little more defined. Here are some snaps just because I like wasting time. The best way to notice the difference is to use an image previewer and flip between them. The combined normal is on the right:

It looks sweet. Thanks [smile]

It looks sweet. Thanks [smile]

###
#5
Crossbones+ - Reputation: **2194**

Posted 06 May 2005 - 01:36 PM

it all comes down to how fast this needs to be. If it's for real-time calculations, or for pre-processing (in that case, I'd average the triangle normals). Also how it compares with extreme cases (very sharp landscape features).

I used the cross-product for a cheap water effect (simple double-buffer filtering, some disruption, hey presto). The results were ok. Maybe you can go and have a look at water rendering techniques, and how they generate real-time super-fast normals, because they have to do that very very quickly.

I guess averaging the neighbouring vertices to pull the normal towards the lowest / highest would be also very cheap, but I don't know how good. Well, seems pretty good from your results.

BTW. Thanks for ++rating. If my rating didn't increase that much, it's probably becuse your own rating is a bit low. So I'll have to rate you up to rate me up :)

haa... there ya go. [grin]

[Edited by - oliii on May 7, 2005 8:36:33 AM]

I used the cross-product for a cheap water effect (simple double-buffer filtering, some disruption, hey presto). The results were ok. Maybe you can go and have a look at water rendering techniques, and how they generate real-time super-fast normals, because they have to do that very very quickly.

I guess averaging the neighbouring vertices to pull the normal towards the lowest / highest would be also very cheap, but I don't know how good. Well, seems pretty good from your results.

BTW. Thanks for ++rating. If my rating didn't increase that much, it's probably becuse your own rating is a bit low. So I'll have to rate you up to rate me up :)

haa... there ya go. [grin]

[Edited by - oliii on May 7, 2005 8:36:33 AM]