在OpenGL中,glRotate函数旋转的是相机、世界坐标系还是模型对象?

5
我想知道 glRotate 是否旋转相机、世界轴或物体。请通过示例说明它们之间的区别。
2个回答

9

相机

OpenGL 中没有相机。

世界坐标轴

OpenGL 中没有世界的概念。

或者对象

OpenGL 中没有对象。

感到困惑了吗?


OpenGL 是一个绘图系统,它使用点、线和三角形进行操作。在 OpenGL 中没有场景或世界的概念。所有的顶点都有一组属性,并且 OpenGL 的状态决定了如何将顶点转换为像素。

这个过程的第一阶段是在视口中获取顶点位置。在固定功能管线中(即不使用着色器),为了获得这些位置,每个顶点位置首先与所谓的“模型视图”矩阵相乘,中间结果用于光照计算,然后再与“投影”矩阵相乘。之后应用剪裁和规范化到视口坐标。

我提到的这两个矩阵有两个目的。第一个“模型视图”用于对传入的顶点应用一些变换,使其最终处于所需位置相对于原点。首先将几何体移动到世界上某个地方,然后将视点移动到世界上某个地方没有区别。或者保持视点在原点,将整个世界向相反方向移动。所有这些都可以通过模型视图矩阵来描述。

第二个“投影”与规范化过程一起像是一种“镜头”,所谓的。通过它,您可以设置视场(以及一些其他参数,如移位,您需要用于某些应用程序-不要担心它)。

矩阵的有趣之处在于它们是非交换的,即对于给定的两个矩阵 N、M

M * N =/= N * M ; for most M, N

这意味着,您可以将一系列变换A,B,C,D…通过以正确顺序相乘的方式组合成一个复合变换矩阵T。OpenGL矩阵操作函数(它们已经过时了)也是这样做的。例如,您选择了一个用于操作的矩阵(矩阵模式),例如modelview M。然后glRotate实际上执行以下操作:
M *= R(angle,axis)

例如,活动矩阵会乘以从给定参数构造的旋转矩阵。缩放和平移同理。

如果这看起来像相机或物体的放置,则完全取决于如何以及以哪种顺序组合这些操作。

但对于OpenGL而言,只有数字/向量(顶点属性),它们以某种方式转化为二维视口坐标,并作为填充点、线或三角形进行绘制。


对于仅翻译第一部分(当然,其他部分也很好)的内容加1。 - Christian Rau

1

glRotate 作用于当前矩阵。因此,它取决于矩阵是相机矩阵还是世界变换矩阵。要了解有关当前矩阵的更多信息,请查看 glMatrixMode()。 找到示例只需谷歌一下:我找到了这个,应该能帮助您弄清楚发生了什么。


1
glMatrixMode 用于在 OpenGL 中切换不同的矩阵。然而,没有明确的相机矩阵。有投影矩阵,但它更像是相机镜头,而不是整个相机。视图是通过 modelview 矩阵移动的,模型几何也是如此。 - datenwolf
如何获取相机矩阵和世界矩阵,并对它们应用变换?我们在OpenGL中输入的顶点坐标是相对于世界坐标系吗? - topcoder
@topcoder,“相机”由透视矩阵驱动。请看dantenwolf的回复。 - Felice Pollano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接