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?
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>
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
Recommended Tutorials
Advertisement