I know it's getting old but... problems with vertex normals
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?
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>
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>
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement