OpenTK - 如何旋转2D对象

时间:2014-12-30 21:06:53

标签: c# windows winforms opengl opentk

我试图在我的OpenTK项目中旋转2D对象。

发生的事情是旋转物体后的物体在旋转,我不希望它们这样做。

在我已经旋转了一个物体后,如何重置旋转?

      protected override void OnRenderFrame(FrameEventArgs e)
       {
           GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
           GL.MatrixMode(MatrixMode.Projection);
           GL.LoadIdentity();
           GL.Ortho(0, game.Width, game.Height, 0, -1, 4);

           GL.MatrixMode(MatrixMode.Modelview);
           GL.LoadIdentity();

          drawObject();
          GL.Rotate(180, Vector3d.UnitZ);
          drawObject(); // Object I want to rotate
          GL.Rotate(-180, Vector3d.UnitZ);
          drawObject(); // I don't want this object to be rotated, but it does. How do I fix this?
}

谢谢!

1 个答案:

答案 0 :(得分:3)

在固定功能管道中,不附加旋转操作。而是第二个替换第一个(只要中间没有PushMatrix操作)。所以你当前绘制的是第一个旋转180度左右的物体,第二个物体旋转-180度左右。

回到你的问题:如果你用RotI替换第二次调用LoadIdentity,当前的模型矩阵会被重置为一个单位矩阵,删除所有的变换。

drawObject();
GL.Rotate(180, Vector3d.UnitZ);
drawObject();
GL.LoadIdentity();
drawObject();

注意:此处会重置所有转换,如果您想保留翻译和缩放,可以尝试GL.Rotate(0, Vector3d.UnitZ);