I know it's getting old but... problems with vertex normals

Started by
2 comments, last by Kirkbag 21 years, 10 months ago
Hey guys, my problem is this: although i know exactly how 2 calculate the face normals AND the vertex normals on my terrain generator, i''m having trouble implementing it with a 2d array of vertices(that i like 2 use heh). i''m sure it''s possible to calculate the normals properly, coz i managed to count the polygons shared by each vertex. i think that my main problem is that i somehow get a negative value on my vNormal.y, althought trying to use an absolute value DIDn''T help so mayb it''s something else. any ideas?
Advertisement
put in code to visualize the normals. it''s the easiest way to work out whats screwed up.
ok these r some code snippets that relate 2 normal generation:

struct GLvector
{
GLfloat x, y, z;
};

struct GLvertex
{
GLvector pos, normal;
GLfloat diffuse;
GLuint nTimesShared;
};

GLvertex TerrainVertices[NumHills+1][NumHills+1];

GLvoid InitGLGeometry(GLvoid)
{
int i, j;

GLvector FaceNormals[NumHills][NumHills*2];

// initializing terrain vertices and normals

for (i=0; i<=NumHills; i++)
for (j=0; j<=NumHills; j++)
{
TerrainVertices[j].pos.x = GLfloat(i-(GLfloat(NumHills)/2.0f));
TerrainVertices[j].pos.y = GLfloat(0);<br> TerrainVertices[j].pos.z = GLfloat(j-(GLfloat(NumHills)/2.0f));<br><br> TerrainVertices[j].nTimesShared = 0;<br><br> TerrainVertices[j].normal.x = 0;<br> TerrainVertices[j].normal.y = 0;<br> TerrainVertices[j].normal.z = 0;<br> }<br><br> GenerateHeightMap(); // works fine, will not b included <br><br> for (i=0; i<NumHills; i++)<br> for (j=0; j<NumHills; j++)<br> {<br> FaceNormals[j*2].x = float((TerrainVertices[i+1][j].pos.x-TerrainVertices[j].pos.x)*<br> (TerrainVertices[j].pos.x-TerrainVertices[j+1].pos.x));<br> <br> FaceNormals[j*2].y = float((TerrainVertices[i+1][j].pos.y-TerrainVertices[j].pos.y)*<br> (TerrainVertices[j].pos.y-TerrainVertices[j+1].pos.y));<br> <br> FaceNormals[j*2].z = float((TerrainVertices[i+1][j].pos.z-TerrainVertices[j].pos.z)*<br> (TerrainVertices[j].pos.z-TerrainVertices[j+1].pos.z));<br><br> length = (float)sqrt(((FaceNormals[j*2].x*FaceNormals[j*2].x)+<br> (FaceNormals[j*2].y*FaceNormals[j*2].y)+<br> (FaceNormals[j*2].z*FaceNormals[j*2].z)));<br> <br> if (FaceNormals[j*2].y<0)<br> {<br> FaceNormals[j*2].x /= -length;<br> FaceNormals[j*2].y /= -length;<br> FaceNormals[j*2].z /= -length;<br> }<br> else<br> {<br> FaceNormals[j*2].x /= length;<br> FaceNormals[j*2].y /= length;<br> FaceNormals[j*2].z /= length;<br> }<br><br> FaceNormals[(j*2)+1].x = float((TerrainVertices[i+1][j+1].pos.x-TerrainVertices[i+1][j].pos.x)*<br> (TerrainVertices[i+1][j].pos.x-TerrainVertices[i+1][j+1].pos.x));<br> <br> FaceNormals[(j*2)+1].y = float((TerrainVertices[i+1][j+1].pos.y-TerrainVertices[i+1][j].pos.y)*<br> (TerrainVertices[i+1][j].pos.y-TerrainVertices[i+1][j+1].pos.y));<br> <br> FaceNormals[(j*2)+1].z = float((TerrainVertices[i+1][j+1].pos.z-TerrainVertices[i+1][j].pos.z)*<br> (TerrainVertices[i+1][j].pos.z-TerrainVertices[i+1][j+1].pos.z));<br><br> length = (float)sqrt(((FaceNormals[(j*2)+1].x*FaceNormals[(j*2)+1].x)+<br> (FaceNormals[(j*2)+1].y*FaceNormals[(j*2)+1].y)+<br> (FaceNormals[(j*2)+1].z*FaceNormals[(j*2)+1].z)));<br><br> if (FaceNormals[(j*2)+1].y<0)<br> {<br> FaceNormals[(j*2)+1].x /= -length;<br> FaceNormals[(j*2)+1].y /= -length;<br> FaceNormals[(j*2)+1].z /= -length;<br> }<br> else<br> {<br> FaceNormals[(j*2)+1].x /= length;<br> FaceNormals[(j*2)+1].y /= length;<br> FaceNormals[(j*2)+1].z /= length;<br> }<br> <br><br> }<br><br> // finding polygon sharing for each vertex<br><br> for (i=0; i<NumHills; i++)<br> for (j=0; j<NumHills; j++)<br> {<br> TerrainVertices[j].nTimesShared++;<br> TerrainVertices[i+1][j].nTimesShared++;<br> TerrainVertices[j+1].nTimesShared++;<br><br> TerrainVertices[i+1][j].nTimesShared++;<br> TerrainVertices[j+1].nTimesShared++;<br> TerrainVertices[i+1][j+1].nTimesShared++;<br><br> TerrainVertices[j].normal.x += FaceNormals[j*2].x;<br> TerrainVertices[j].normal.y += FaceNormals[j*2].y;<br> TerrainVertices[j].normal.z += FaceNormals[j*2].z;<br><br> TerrainVertices[i+1][j].normal.x += FaceNormals[j*2].x;<br> TerrainVertices[i+1][j].normal.y += FaceNormals[j*2].y;<br> TerrainVertices[i+1][j].normal.z += FaceNormals[j*2].z;<br><br> TerrainVertices[j+1].normal.x += FaceNormals[j*2].x;<br> TerrainVertices[j+1].normal.y += FaceNormals[j*2].y;<br> TerrainVertices[j+1].normal.z += FaceNormals[j*2].z;<br><br> TerrainVertices[i+1][j].normal.x += FaceNormals[(j*2)+1].x;<br> TerrainVertices[i+1][j].normal.y += FaceNormals[(j*2)+1].y;<br> TerrainVertices[i+1][j].normal.z += FaceNormals[(j*2)+1].z;<br><br> TerrainVertices[j+1].normal.x += FaceNormals[(j*2)+1].x;<br> TerrainVertices[j+1].normal.y += FaceNormals[(j*2)+1].y;<br> TerrainVertices[j+1].normal.z += FaceNormals[(j*2)+1].z;<br><br> TerrainVertices[i+1][j+1].normal.x += FaceNormals[(j*2)+1].x;<br> TerrainVertices[i+1][j+1].normal.y += FaceNormals[(j*2)+1].y;<br> TerrainVertices[i+1][j+1].normal.z += FaceNormals[(j*2)+1].z;<br> }<br><br> for (i=0; i<=NumHills; i++)<br> for (j=0; j<=NumHills; j++)<br> {<br> TerrainVertices[j].normal.x /= (float)TerrainVertices[j].nTimesShared;<br> TerrainVertices[j].normal.y /= (float)TerrainVertices[j].nTimesShared;<br> TerrainVertices[j].normal.z /= (float)TerrainVertices[j].nTimesShared;<br> }<br>}<br><br><br> </i>
Umm nm guys... i rewrote my entire normals code and create some simple CrossProduct() and CalcVector() funcs and whoa it worked. yay for me. thanks anyway!

This topic is closed to new replies.

Advertisement