【发布时间】:2014-11-28 04:00:05
【问题描述】:
我正在编写一个 OpenGL 应用程序(C# 和 OpenTK),但我对 OpenGL 转换的工作原理感到困惑。
我已经设置了一个透视投影,我在默认位置,默认方向(+X 向右,+Y 向上,+Z 向我靠近。)现在我在我的 XY 平面上绘制一个四边形, 在 Z 轴 -10 处。
GL.Begin(PrimitiveType.Quads);
GL.Color3(Color.Green);
GL.Vertex3(-1, 1, -10);
GL.Vertex3(1, 1, -10);
GL.Vertex3(1, -1, -10);
GL.Vertex3(-1, -1, -10);
GL.End();
这按预期工作。但现在我想沿 其本地 Y 轴旋转四边形,所以我添加了一个旋转,它被应用于我的单位矩阵。这是相关的代码部分:
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.Rotate(10, 0, 1, 0);
GL.Begin(PrimitiveType.Quads);
GL.Color3(Color.Green);
GL.Vertex3(-1, 1, -10);
GL.Vertex3(1, 1, -10);
GL.Vertex3(1, -1, -10);
GL.Vertex3(-1, -1, -10);
GL.End();
但这会使飞机围绕我的“世界”Y 轴旋转,所以现在飞机不再穿过我的 -Z 轴,而是成一个角度。
问题
如何将对象保持在所需位置(沿我的 Z 轴在 -10 处)但让它围绕自己的轴旋转?
我尝试过的
我尝试过先平移到原点,执行旋转,绘制,然后向后移动,但这也不起作用,大概是因为一旦我旋转了,现在我不再沿着“世界”平移" 轴,但旋转轴。这是代码:
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.Translate(0, 0, 10);
GL.Rotate(10, 0, 1, 0);
GL.Begin(PrimitiveType.Quads);
GL.Color3(Color.Green);
GL.Vertex3(-1, 1, -10);
GL.Vertex3(1, 1, -10);
GL.Vertex3(1, -1, -10);
GL.Vertex3(-1, -1, -10);
GL.End();
GL.Translate(0, 0, -10);
我觉得我需要使用PushMatrix 和PopMatrix,但我不太确定我是否理解它们是如何发挥作用的。如果我在执行任何操作之前推送我的矩阵,然后弹出它,我的视图不应该恢复正常吗?如果是这样,为什么这不起作用:
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
// Push current matrix onto the stack
GL.PushMatrix();
// Perform operations on newly pushed matrix
GL.Translate(0, 0, 10);
GL.Rotate(10, 0, 1, 0);
GL.Begin(PrimitiveType.Quads);
GL.Color3(Color.Green);
GL.Vertex3(-1, 1, -10);
GL.Vertex3(1, 1, -10);
GL.Vertex3(1, -1, -10);
GL.Vertex3(-1, -1, -10);
GL.End();
// Pop it off, so return to my previous matrix
GL.PopMatrix();
【问题讨论】: