阻止光线进行顶点变换

时间:2012-03-14 11:07:34

标签: opengl transformation jogl light

我正在尝试构建一个场景,其中有一个透视图,可以看到纹理立方体和灯光。

应该发生的事情是光应该停留在立方体上方的某个位置,而立方体在该光线下方旋转(相对于其中心)。

实际发生的事情是,当立方体旋转时,灯光也会旋转。

我尝试使用Google搜索并查找类似的问题,但我发现没有任何帮助。在OpenGL文档之后,我理解光位置受到模型视图矩阵变换的影响,但我也理解在所述变换之前/之后推动/弹出矩阵将使光不再受它们的影响。然而,我无法使其工作,无论我是否将模型视图转换(对于立方体)隔离到推/弹或如果我之后加载单位矩阵,灯都会继续旋转。

这是代码(使用JOGL在Java中):

//this array goes into lightPositionBuffer 
private float[] lightPosition = {0, 0, 0, 1.0f};

public void display(GLAutoDrawable gLDrawable) {
    //code for clearing screen, binding the textures, etc.

    gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
    gl.glFrontFace(GL2.GL_CCW);
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, cubeVerticesBuffer);
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, cubeTextureCoordsBuffer);

    //rotate the cube
    gl.glPushMatrix();    
    gl.glTranslatef(cubeCenterXInitial,cubeCenterYInitial,cubeCenterZInitial);
    gl.glRotatef(rotationAmountY, 1, 0, 0);
    gl.glTranslatef(-cubeCenterXInitial,-cubeCenterYInitial,-cubeCenterZInitial);
    rotationAmountY+=1.5f;
    gl.glDrawElements(GL.GL_TRIANGLE_STRIP, cubeIndexes.length, GL.GL_UNSIGNED_BYTE, cubeIndexesBuffer);
    gl.glPopMatrix();

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY);

    //Position The Light:
    gl.glPushMatrix();
    //lightPositionBuffer is a FloatBuffer containing the lightPosition float array declared above:
    gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer);
    gl.glPopMatrix();
    //Enable Light 0
    gl.glEnable(GL2.GL_LIGHT0); 
    gl.glEnable(GL2.GL_LIGHTING);
}

以下是发生的事情:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

好的我已修好了。这是两个重点:

  1. 正如卢克在他的回答中提到的那样,就转换而言,我的代码没有任何问题。事实上,转型只影响网格,事实上光依然存在。

  2. 为什么看起来我的立方体周围有一个光线旋转(实际上光线还是静止的)就是这样的原因。

  3. 更多的话说:我的立方体脸部缺乏法线声明。是的,谁知道,我没有。当你有一些面孔(如三角形和四边形)和一个光线时,不会声明法线不会让你的表面不受光的影响。它们实际上受到了影响,但这一切都很奇怪(正如你在问题文本中的截图中看到的那样)。

    所以基本上我要做的就是看看Nehe的(我喜欢那些家伙)第07课:

    http://nehe.gamedev.net/tutorial/texture_filters_lighting__keyboard_control/15002/

    在页面底部有大量语言和库的代码,我个人使用JOGL版本,但任何一个都可以。

    然后我还查看了OpenGL文档,看看我如何将顶点/索引/法线声明为数组(而不是单独):

    http://www.songho.ca/opengl/gl_vertexarray.html

答案 1 :(得分:0)

尝试在第二次glPushMatrix()来电之前添加glLoadIdentity()

gl.glPushMatrix();
gl.glLoadIdentity(); // This
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer);
gl.glPopMatrix();

正如它在您的原始帖子中所表示的那样,该推/弹对没有做任何事情。它们之间没有任何矩阵运算。 glPushMatrix()不会重置活动矩阵,它只会保留当前的值集,以便您可以返回到该状态。

我认为您的错误不在您发布的代码中。你能提供一个仍然存在问题的最小工作示例吗?