【问题标题】:gluLookAt and MODELVIEW MATRIXgluLookAt 和 MODELVIEW MATRIX
【发布时间】:2013-03-08 07:53:07
【问题描述】:

我觉得我了解模型视图矩阵和gluLookAt 的用法。也就是说,通过声明gluLookAt(ex,ey,ez,lx,ly,lz,ux,uy,uz),可以轻松设置一种直接查看某个点的方法。

我的问题是 - 由于gluLookAt 后乘当前矩阵,假设您在调用gluLookAt 之前加载标识,并且当前矩阵模式是模型视图,如果您绘制立方体会发生什么?

所以是这样的:

glMatrixMode(GL_PERSPECTIVE);
glLoadIdentity();
glFrustum(-5, 5, -5, 5, 15, 150);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 16, 0, 0, 0, 0, 1, 0);
glutSolidCube(1.0);

在世界坐标中渲染的立方体在哪里?出于某种原因,在这种情况下,它是在世界原点渲染的,您可以在视口中看到它 - 但为什么呢? gluLookAt 不应该用视图旋转和平移修改模型视图矩阵吗?立方体不应该本质上是用里面的相机渲染的吗?

【问题讨论】:

    标签: opengl glulookat


    【解决方案1】:

    glutSolidCube(1.0) 绘制一个以世界原点为中心的边长为 1.0 的立方体。

    所以顶点是:

    • (-0.5, -0.5, -0.5)
    • (-0.5, +0.5, -0.5)
    • (-0.5, +0.5, +0.5)
    • (-0.5, -0.5, +0.5)
    • (+0.5, -0.5, -0.5)
    • (+0.5, +0.5, -0.5)
    • (+0.5, +0.5, +0.5)
    • (+0.5, -0.5, +0.5)

    现在 gluLookAt(0, 0, 16, 0, 0, 0, 0, 1, 0) 生成一个 modeView 矩阵,将这些坐标转换为相机坐标。

    由于相机位置仅相对于默认相机位置 (0,0,0) 平移了 (0,0,16),因此这个模型视图矩阵基本上将每个顶点平移了 (0,0,-16)。

    清除?

    【讨论】:

    • 我可以将其解释为,从世界坐标系来看,gluLookAt 会相对于相机平移世界原点吗?
    • 在你的情况下是的。但一般来说可以是旋转+平移。所以 gluLookAt 创建了一个 ModelViewMatrix ,它从模型坐标(基本上是世界坐标,即原点(0,0,0)查看目录(0,0,-1))转换(旋转+平移)到视图坐标(坐标系从相机/眼睛看,即凸轮位置的原点,相机的观察方向)
    • 太棒了!棘手的东西,但我想我现在明白了。
    • @Dirk,那么如果我通过调用 rotate(90,0,1,0) 旋转对象,最终坐标是多少?旋转半径是 16 吗?
    • glRotate 将按照给定的角度和轴并围绕原点(0,0,0)旋转场景。如果没有 gluLookAt,Cube 会以原点为中心。在这种情况下,您也可以围绕立方体的中心旋转,但通常不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多