JOGL correct light and reflection in spheres

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

JOGL correct light and reflection in spheres

Jason Trinidad
I'm trying to get the lights and reflection correct in my program. I have a big sphere, which I can move the the mouse, that should be a light source (LIGHT0), and smaller spheres bouncing around that should reflect the light. I also need a directional light that I can change the direction using the keyboard

first some colors I defined:

float whitish[] = {0.8f, 0.8f, 0.8f, 1};
float white[] = {1, 1, 1, 1};
float blackish[] = {0.2f, 0.2f, 0.2f, 1};
float black[] = {0, 0, 0, 1}
I create the directional light with

gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, blackish,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, white,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, white,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, spot_position,0);
spot_position is initially [ 0, 0, 1, 0] but it can change by pressing the keyboard keys. a key press adds 0.05 to a specific component of the position vector, until it reaches 1, then it resets back to -1 (nothing fancy).

The light of the center sphere is:

gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, blackish,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, white,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, white,0);
This light's position is always centered inside my big transparent sphere. w component of the position vector is 1.

I have this code to draw the picture in the back

gl.glBegin(GL_QUADS);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, white,0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, white,0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, white,0);
// Back Face
gl.glNormal3f(0, 0, 1);
gl.glTexCoord2f(texRight, texBottom);
gl.glVertex3f(rx2, ry1, rz1);
gl.glTexCoord2f(texRight, texTop);
gl.glVertex3f(rx2, ry2, rz1);
gl.glTexCoord2f(texLeft, texTop);
gl.glVertex3f(rx1, ry2, rz1);
gl.glTexCoord2f(texLeft, texBottom);
gl.glVertex3f(rx1, ry1, rz1);
To draw the spheres, I use the following functions:

public void drawtriangle(float[] v1, float[] v2, float[] v3) {
    gl.glBegin(GL.GL_TRIANGLES);
    gl.glNormal3fv(v1, 0);
    gl.glVertex3fv(v1, 0);
    gl.glNormal3fv(v2, 0);
    gl.glVertex3fv(v2, 0);
    gl.glNormal3fv(v3, 0);
    gl.glVertex3fv(v3, 0);
    gl.glEnd();
}

private void subdivideSphere2(float v1[], float v2[], float v3[], long depth) {
   float v12[] = new float[3];
   float v23[] = new float[3];
   float v31[] = new float[3];
    int i;

    if (depth==0) {
    float[] color= {v1[0]*v1[0], v2[1]*v2[1], v3[2]*v3[2], alpha};
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, blackish,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, color,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, color,0);
      drawtriangle(v1, v2, v3);
      return;
    }
   for (i = 0; i<3; i++) {
       v12[i] = v1[i]+v2[i];
       v23[i] = v2[i]+v3[i];
       v31[i] = v3[i]+v1[i];
    }
    normalize(v12);
    normalize(v23);
    normalize(v31);
    subdivideSphere2(v1, v12, v31, depth-1);
    subdivideSphere2(v2, v23, v12, depth-1);
    subdivideSphere2(v3, v31, v23, depth-1);
    subdivideSphere2(v12, v23, v31, depth-1);
}


public void drawSphere() {
    subdivideSphere2(sVdata[0], sVdata[1], sVdata[2], depth);
    subdivideSphere2(sVdata[0], sVdata[2], sVdata[4], depth);
    subdivideSphere2(sVdata[0], sVdata[4], sVdata[5], depth);
    subdivideSphere2(sVdata[0], sVdata[5], sVdata[1], depth);

    subdivideSphere2(sVdata[3], sVdata[1], sVdata[5], depth);
    subdivideSphere2(sVdata[3], sVdata[5], sVdata[4], depth);
    subdivideSphere2(sVdata[3], sVdata[4], sVdata[2], depth);
    subdivideSphere2(sVdata[3], sVdata[2], sVdata[1], depth);
 }  
My problem is, the small spheres aren't reflecting light at all. They are very bright all the time. I can see a little bit of the light being reflected in the green lines of the cube when I move the big sphere closer to them, but no effect at all to the spheres. Also, I can't see any difference when I move the directional light (LIGHT1). I don't see any reflection on the lines of the cube, the big sphere, small spheres or the picture in the back. Below is screenshot of my program. How can I make my spheres not shine, and reflect both the directional light and the light from the big sphere? Any help would be greatly appreciated. Thank you.

http://i.imgur.com/fzCRC2K.png