在我的Opengl程序中(在我应用透视投影矩阵之前)每当我绘制一些对象时,我在世界坐标系的原点绘制它,但是几乎所有的Opengl教程都指出相机(我的投影视图)位于在看起来正z轴的原点(这取决于你以后如何处理投影矩阵中的z值),但是如果这是真的,我的相机(位于原点)如何能够查看位于原点。
注意:我需要这些信息,以便我移动世界并围绕原点旋转它,这样我就会产生旋转的相机错觉。
答案 0 :(得分:3)
屏幕上显示的内容取决于您应用的整个转换。我以您为投影和(模型)视图转换使用单位矩阵的方式解释您的问题。在这种情况下,您将直接在剪辑空间中绘图。从技术上讲,这将定义原点处的摄像机位置,但视锥体将等同于Ortho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0)
设置 - 因此您的视锥体将位于摄像机的后半部分(这完全没问题)对于正射投影,但似乎违反直觉)。对于相机方向,该部分更加暧昧。通常,GL具有相机在-z方向上看的惯例,但在剪辑空间中,+ z将指向屏幕,而经典Ortho
和Perspective
函数通过实际使用{来对待它{1}}和z_near=-near
代表z_far=-far
和near
参数。 (这也是为什么通过far
调用实现identy变换的原因,最后两个符号相对于x和y范围翻转)。因此,在这种情况下,一个可以认为相机实际上是沿着+ z看,或者可以说相机看起来是-z,但近距离和远距离的平面被投影交换。这是你喜欢解释这些事情的问题。这些惯例主要与经典"固定功能" GL,使用眼睛位置进行照明和雾计算(也许还可以查看其他内容)。并且它也可能假设"相机看起来-z"如果未启用Ortho
,则会计算高光照明术语的惯例(默认情况下已停用,请参阅glLightModel()
。
在现代GL中,除了剪辑空间的左手性之外,不存在这样的约定,并且您可以为眼睛空间制定自己的约定(如果需要)。