首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(glu)lookAt的推导

(glu)lookAt的推导
EN

Stack Overflow用户
提问于 2013-11-03 18:28:26
回答 2查看 1.6K关注 0票数 2

我正在努力学习(现代) OpenGL,我对各种转变感到非常困惑。

观察矩阵让我困惑,所以我需要一些澄清。

以下是我对(常规)管道的理解。

  1. 顶点在世界空间中指定,使用建模矩阵将其缩放、转换、旋转等到所需的位置。
  2. (这是我开始感到困惑的地方)我们可以(可选地)使用"lookAt“函数(gluLookAt)将虚拟相机定位到所需的位置。我在这里遵循矩阵的推导:http://www.youtube.com/watch?v=s9FhcvjM7Hk。我明白了,直到那个时候,教授才算出“看-看”向量。他说目视矢量=眼睛中心。现在我开始迷路了。我的第一本能是矢量应该是中心眼。假设中心向量为(0,0,0),眼矢量为(0,0,5)。要观察物体,相机应该指向中心眼= (0,0,-5).然而,这位教授说,我们希望将中心眼移到-z方向(这意味着什么?)因此,眼睛中心会给出方向的观察.我对此感到困惑。他进一步补充说,在OpenGL中,在原点有一个照相机,可以看到(0,0,-1)。现在,这是我完全不明白的。我确实明白,查看转换只不过是对对象应用逆变换。我做了一些实验,发现当我画一个z值为1的三角形(绝对没有模型视图/投影转换)时,它仍然绘制在屏幕上。然而,我不认为这是这样的,因为相机是在原点。

总之..。

  • 为什么要看眼睛中心?
  • 这是什么关于相机在原点,看z=-1?

有什么解释吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-03 18:51:10

当呈现三角形时,顶点的坐标解释如下:

  • X坐标将影响视口上的水平位置.-1是左边,+1是右边。
  • Y坐标将影响视口上的垂直位置.-1是底部边缘,+1是顶部边缘。
  • Z坐标将影响深度信息。-1是照相机平面(近)的位置,+1是远平面。此值通常用于向深度缓冲区写入。

这就是为什么简单的例子在远平面上呈现一个可见的三角形。

现在让我们来看一下视图转换。该变换将由四个向量构造。(1,0,0)的象,(0,1,0)的象,(0,0,1)的象和平移向量。然而,由于视图转换是一种逆变换,因此产生的矩阵必须反转。

您是对的,视图方向是center - eye。然而,这不是我们需要的矩阵。我们需要(0,0,1)的图像。通常,OpenGL程序使用右手坐标系.在那个系统中,摄像机会观察到负的z方向。所以center - eye实际上是(0,0,-1)的图像。然后(0,0,1)的图像就是eye - center。这就是你所需要的。

有了这个定义,您还需要一个适当的投影转换。否则,您只会看到相机后面的东西(因为z坐标是正的,因此有一个正的深度值)。投影变换负责将负z坐标转换为正深度值.

票数 2
EN

Stack Overflow用户

发布于 2013-11-03 18:48:01

当使用虚拟相机时,通常定义一个眼空间。这个定义可以是任意性的,但是有一些普遍的约定(以及GL定义的旧矩阵堆栈,或者更倾向于某些约定)。为下列约定指定了gluLookAt

  1. 照相机放在原处。
  2. 相机看负z方向,+x是右轴,+y是上方向(所以我们有一个右手坐标系)。

您应该知道,在呈现时,world space并不重要。重要的是对象相对于虚拟摄像机/眼睛的相对位置(这也是为什么旧的GL矩阵堆栈有一个组合的ModelView矩阵,而不是ModelView转换的两个独立矩阵的原因)。使用一个放置所有物体的世界空间,并在该空间中指定一个虚拟相机,这是更直观的。这就是gluLookAt应该做的。如果你把view矩阵放在恒等式上,那就好像你的相机是在世界空间起源处,朝-z方向看一样。因此,为了获得将相机移动到某个指定的目点的效果,这与将世界空间中的所有物体朝相反方向移动一样。旋转也是如此。gluLookAt将设置一个旋转和一个平移。有关细节,请看一下gluLookAt

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19756415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档