0

I'm trying to get my lighting to work in OpenGL, using LWJGL as an implementation library. The problem I think I'm having, is that I don't set my normals properly and therefore the lighting doesn't work at certain angles. Here is the code for the cube I'm testing on:

glBegin(GL_QUADS);

glColor3f(r,g,b);

glNormal3f(position.x, position.y, position.z - radius - 0.1f);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);

glNormal3f(position.x, position.y, position.z + radius + 0.1f);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);

glNormal3f(position.x - radius - 0.1f, position.y, position.z);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);

glNormal3f(position.x + radius + 0.1f, position.y, position.z);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);

glNormal3f(position.x, position.y - radius - 0.1f, position.z);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);

glNormal3f(position.x, position.y + radius + 0.1f, position.z);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);

glEnd();
Perception
  • 79,279
  • 19
  • 185
  • 195
Philippe Paré
  • 4,279
  • 5
  • 36
  • 56
  • 1
    So... what is this *supposed* to do, and what is it actually doing? – Nicol Bolas Mar 09 '13 at 21:53
  • I just want to make sure my normals are OK because I'm not I understand properly how to calculate them... it's a point in front of the surface ? right ? – Philippe Paré Mar 09 '13 at 21:55
  • @PhilippeParé: No, it's not a point in front of the surface, but the direction perpendicular to the surface, represented by a vector of length 1. You calculate them in R³ using the cross-product of the vectors spanning a triangle. – datenwolf Mar 09 '13 at 21:59

1 Answers1

1

Normal vectors are relative to the vertex itself and are always normalized (ie: they have length one).

So, a line like this:

glNormal3f(position.x, position.y, position.z - radius - 0.1f);

Should be replaced by:

glNormal3f(0.0f, 0.0f, 1.0f);
Martijn Courteaux
  • 67,591
  • 47
  • 198
  • 287