光线正在被相机改变

本文关键字:相机 改变 | 更新日期: 2023-09-27 18:32:27

很长一段时间以来,我一直在 OpenTK 中修复我正在从事的项目的照明。问题基本上是,当我旋转相机时,我显示的地形上显示的照明也会旋转。

这是我的onRenderFrame代码片段:

protected override void OnRenderFrame(FrameEventArgs e)
    {
        base.OnRenderFrame(e);
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        float dist = (float)Math.Sin(Math.PI / 3) * camZoom;
        Matrix4 view = Matrix4.LookAt(new Vector3(-(float)Math.Cos(camRot) * dist, dist, -(float)Math.Sin(camRot) * dist) + camPos, camPos, new Vector3(0, 1, 0));
        //Note: camPos isn't actually the position of the camera, rather the target of it. The actual camera position is calculated above.

        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref view);
        float tx = 50;
        float ty = 20;
        float tz = -15;
        GL.Light(LightName.Light0, LightParameter.Position, new float[] { tx, ty, tz});
        GL.Begin(BeginMode.Lines);
        DrawBox(tx - 2, tx + 2, ty - 2, ty + 2, tz - 2, tz + 2);
        GL.End();

。地形图在这里

我使用快速绘图框功能在灯光的位置周围绘制了一个简单的框。它工作正常,我什至实现了一些运动,例如太阳绕地球。虽然相机没有移动,但这效果很好。但是一旦我转动相机,灯光就不再显示它应该有的东西,它似乎"移动"了光线,而没有真正移动它(绘制的盒子没有移动,只有光线的效果)。

光线正在被相机改变

根据 OpenGL 规范,使用 GL_POSITION 参数的 glLight:

GL_POSITION:参数包含四个整数或浮点值,用于指定光源在均匀对象坐标中的位置。整数值和浮点值都直接映射。整数值和浮点值均不固定。

当调用glLight时,位置由模型视图矩阵转换(就像它是一个点一样),并存储在眼睛坐标中。如果位置的 w 分量为 0,则光被视为定向光源。漫射和镜面反射照明计算会考虑光的方向,但不考虑其实际位置,并且禁用衰减。否则,漫射和镜面反射照明计算基于光在眼睛坐标中的实际位置,并启用衰减。初始位置为 (0, 0, 1, 0);因此,初始光源是定向的、平行于 - Z 轴的,并且沿 - Z 轴的方向。

你只通过三个浮子。我不能确定 OpenTK 使用什么作为第四 (w) 组件,但我猜它会使任何未指定的参数为 0,从而使您的光线定向并忽略您给出的位置。我会尝试在您传入的数组末尾添加一个 1.0,看看是否可以解决问题。