相对镜头旋转?

时间:2010-11-11 19:32:13

标签: c# opengl opentk

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

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);

1 个答案:

答案 0 :(得分:2)

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

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

你需要:

  • 用3个变量替换move,以便在x,y,z方向上移动
  • look替换为2个变量,yaw表示左右看,pitch表示上下看,谷歌搜索“欧拉角”以获取更多理论;
  • 移动循环外的所有人 - 他们需要在帧之间保持。

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

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

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