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();
・・・地形図はこちら
簡単な DrawBox 関数を使用して、ライトの位置の周りに単純なボックスを描画しました。それは正常に機能しています。地球の周りの太陽などの動きも実装しました。カメラは移動していませんが、これはうまく機能していました。しかし、カメラの向きを変えると、照明は本来あるべきものを表示しなくなり、実際には動かさずに、光を「動かした」ように見えました (描かれたボックスは動かされず、光の効果のみでした)。