0

我目前已将此更新代码设置为旋转和移动我的相机。

float move = 0.5f;
        float look = 0.01f;


        //Rotation
        if (Keyboard[Key.Left]) {

            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (-look));
        }
        if (Keyboard[Key.Right]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationY (look));

        }
        if (Keyboard[Key.Up])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (-look));
        }
        if (Keyboard[Key.Down])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateRotationX (look));
        }

        //Movement
        if (Keyboard[Key.W])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, move));
        }
        if (Keyboard[Key.S]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (0f, 0f, -move));
        }
        if (Keyboard[Key.A])
        {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (move, 0f, 0));
        }
        if (Keyboard[Key.D]) {
            modelview = Matrix4.Mult (modelview, Matrix4.CreateTranslation (-move, 0f, 0));
        }

当我移动我的相机时,它模拟了围绕世界原点(0,0,0)而不是其当前位置旋转的效果。

我的模型视图矩阵是这样加载的:

            GL.MatrixMode (MatrixMode.Modelview);
        GL.LoadMatrix (ref modelview);
4

1 回答 1

2

这段代码有很多工作要做。长话短说:

我相信您的代码是渲染循环的一部分?

你需要:

  • 替换move为 3 个变量,用于 x、y、z 方向的移动,
  • 替换look为 2 个变量,yaw左右看和pitch上下看,谷歌搜索“欧拉角”以获得更多理论;
  • 将所有这些移到循环之外-它们需要在帧之间持续存在。

之后,在每一帧中,您应该:

  • 根据输入更新这些变量(增加或减少一个常数值乘以 2 帧之间的增量时间),
  • 用单位矩阵 (LoadIdentity()) 替换模型视图矩阵,
  • 将模型视图矩阵乘以平移 (x,y,z),
  • 乘以 X 平面中的旋转乘以yaw,
  • 乘以 Y 平面的旋转乘以pitch.

综上所述,您需要将输入处理与矩阵处理分开,然后每帧根据当前位置和方向设置正确的模型视图矩阵(作为一组转换)。

于 2010-11-11T20:31:45.703 回答