# Something wrong with my normlal calculation

This topic is 5042 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

For some reason all of my normals for my terrain are coming up as nan when I output them. Not really sure why :( The first thing I do is store the faces for my terrain in terms of offsets in my vertex array. I get this information from the index array:
	int face_num = 0;
for(int i = 0; i < (size - 1); ++i) {
for(int j = 0; j < (size_x2 - 2); ++j) {
face[face_num].v1 = index[(j + i * size_x2)];
face[face_num].v2 = index[(j + i * size_x2) + 1];
face[face_num].v3 = index[(j + i * size_x2) + 2];
compute_normal(vertex[face[face_num].v1], vertex[face[face_num].v3], vertex[face[face_num].v3], face[face_num].normal);
++face_num;
}
}


Once I have the vertices for the face I pass those vertices to a compute_normal function that takes the normal for that face by ref and fills it in. Here is that code:
void terrain::compute_normal(const vector3 & p0, const vector3 & p1, const vector3 & p2, vector3 & n) {
double a[3];
double b[3];
double length;

a[0] = p0.x - p1.x;
a[1] = p0.y - p1.y;
a[2] = p0.z - p1.z;

b[0] = p0.x - p2.x;
b[1] = p0.y - p2.y;
b[2] = p0.z - p2.z;

n.x = a[1] * b[2] - b[1] * a[2];
n.y = b[0] * a[2] - a[0] * b[2];
n.z = a[0] * b[1] - b[0] * a[1];

length = sqrt(n.x * n.x + n.y * n.y + n.z * n.z);

n.x /= length;
n.y /= length;
n.z /= length;
};


At this point I know something has already gone wrong because outputting the vector n in that compute normal functions returns nans but for the sake of completeness, here is how I then get the normals per vertex:
	// zero out the normal array
for(int i = 0; i < num_vertices; ++i) {
normal.x = 0.0;
normal.y = 0.0;
normal.z = 0.0;
}

// sum all the normals for each vertex
for(int i = 0; i < num_faces; ++i) {
normal[face.v1].x += face.normal.x;
normal[face.v1].y += face.normal.y;
normal[face.v1].z += face.normal.z;

normal[face.v2].x += face.normal.x;
normal[face.v2].y += face.normal.y;
normal[face.v2].z += face.normal.z;

normal[face.v3].x += face.normal.x;
normal[face.v3].y += face.normal.y;
normal[face.v3].z += face.normal.z;
};

// normalize the sum
for(int i = 0; i < num_vertices; ++i) {
normalize(normal);
}


Does anyone see a problem in my compute_normals function that I am not seeing?

##### Share on other sites
Ok I see that I was passing the same vertex twice to my compute normal function. Changing that gives me good numbers now I think but theres a different problem...

The lighting on my terrain looks like absolute crap. You can find a pic at binweb.binghamton.edu/~nschwar1...look at test.bmp.

Does anyone know what might be wrong?

##### Share on other sites
As a slight update it appears as though some of the normals I have are the zero vector...

I know for a fact the faces are being calculating correctly and that every vector is being "hit". I sort of looks like sum of the normals are adding up to the zero vector.

Did I miss something really obvious? I even went ahead and compared my code to other code out there and it all looks good...

any help would be really appreciated.

1. 1
2. 2
3. 3
Rutin
18
4. 4
JoeJ
13
5. 5

• 14
• 10
• 24
• 9
• 57
• ### Forum Statistics

• Total Topics
632639
• Total Posts
3007611
• ### Who's Online (See full list)

There are no registered users currently online

×