我正在尝试构建一个场景,其中有一个透视图,可以看到纹理立方体和灯光。
应该发生的事情是光应该停留在立方体上方的某个位置,而立方体在该光线下方旋转(相对于其中心)。
实际发生的事情是,当立方体旋转时,灯光也会旋转。
我尝试使用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);
}
以下是发生的事情:
答案 0 :(得分:1)
好的我已修好了。这是两个重点:
正如卢克在他的回答中提到的那样,就转换而言,我的代码没有任何问题。事实上,转型只影响网格,事实上光依然存在。
为什么看起来我的立方体周围有一个光线旋转(实际上光线还是静止的)就是这样的原因。
更多的话说:我的立方体脸部缺乏法线声明。是的,谁知道,我没有。当你有一些面孔(如三角形和四边形)和一个光线时,不会声明法线不会让你的表面不受光的影响。它们实际上受到了影响,但这一切都很奇怪(正如你在问题文本中的截图中看到的那样)。
所以基本上我要做的就是看看Nehe的(我喜欢那些家伙)第07课:
http://nehe.gamedev.net/tutorial/texture_filters_lighting__keyboard_control/15002/
在页面底部有大量语言和库的代码,我个人使用JOGL版本,但任何一个都可以。
然后我还查看了OpenGL文档,看看我如何将顶点/索引/法线声明为数组(而不是单独):
答案 1 :(得分:0)
尝试在第二次glPushMatrix()
来电之前添加glLoadIdentity():
gl.glPushMatrix();
gl.glLoadIdentity(); // This
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPositionBuffer);
gl.glPopMatrix();
正如它在您的原始帖子中所表示的那样,该推/弹对没有做任何事情。它们之间没有任何矩阵运算。 glPushMatrix()
不会重置活动矩阵,它只会保留当前的值集,以便您可以返回到该状态。
我认为您的错误不在您发布的代码中。你能提供一个仍然存在问题的最小工作示例吗?