"lookthrough"相机的 OpenGL(简单)场景和对象导航基础知识

标签 opengl 3d rotation translation scene

我已经阅读了几篇关于使用 OpenGL 渲染 3D 场景的过于复杂的文章,但并没有真正找到可以帮助我可视化关于 glRotate 和 glTranslate 调用的场景导航基本概念的东西。

通过对 LWJGL(我的特定 OpenGL 库)提供的示例进行试验,我基本了解了它们的使用效果。我可以使用 glTranslate 移动到一个点,使用 glRotate 围绕该点旋转,使用 glLoadIdentity 快速回到原点或使用 glPopMatrix 回到最后一个 glPushMatrix,它们本质上是位置和旋转的快照。最后,场景将相对于原点渲染到屏幕上。

所以基本上,把一个立方体放在 A 点旋转 B:

  • glTranslate(A.x,A.y,A.z) [现在关注点 A]
  • glRotate(B.,,*,*) 用于俯仰、偏航和滚动; [现在旋转到旋转 B]
  • glBegin(GL_QUADS) 和 glVertex3f()x4 相对于对象原点的每个“边”(四边形)
  • glEnd()
  • glLoadIdentity() [重置为其他对象的原点,如果只绘制立方体则不需要]

  • 至于“相机”,由于openGL的“眼睛”是固定的,所以场景必须从相机反向移动,以模拟用相机移动眼睛。这是我到目前为止的理解,如果这是错误的,请让我走上正确的道路。

    现在针对我的具体情况和问题:

    我的“场景”由地形和玩家(一些任意形状,位于与地形相关的位置和“相机”头)组成。 View 应该相对于玩家旋转,而玩家相对于地形移动。我希望最终渲染基本上“透视”玩家的头部或相机。我的困惑在于渲染每个部分的翻译/旋转调用的顺序,以及翻译的方向。以下是相对于玩家的“相机”渲染地形和玩家的正确方法吗?
  • 通过玩家与原点的距离平移远离玩家(移动场景)
  • 旋转远离玩家的旋转(玩家向右看 40 度,所以向左旋转场景 40)
  • 渲染地形
  • 通过 glLoadIdentity
  • 重置
  • 渲染玩家的头部(如果需要)
  • 转换为 body /手/任何位置
  • 旋转远离玩家的旋转(再次第 2 步)
  • 渲染 body /手/任何东西

  • 另外,旋转对翻译有影响吗? Aka,OpenGL 是否相对于旋转进行平移,或者旋转与平移无关?

    最佳答案

    I can use glTranslate to move to a point, glRotate to rotate about that point, and glLoadIdentity to snap back to the origin or glPopMatrix to go back to the last glPushMatrix, which are essentially snapshots of a location and rotation.



    不,不完全。这些功能现在知道场景是什么。他们所做的只是操纵矩阵。这是一篇关于它的优秀文章:

    http://www.opengl.org/wiki/Viewing_and_Transformations

    使用 OpenGL 时要记住的重要一点是,它不是场景图。它所做的只是将平面点、线和三角形渲染到帧缓冲区。没有像您导航的场景这样的东西。

    So basically, to put a cube at point A with rotation B: (...)



    是的,你没看错。

    As for the "camera", since openGL's "eye" is fixed



    好吧,OpenGL 没有相机。它只是通过模型 View 矩阵插入顶点,对它们进行照明计算,然后将它们通过投影并将它们映射到视口(viewport)。

    关于 "lookthrough"相机的 OpenGL(简单)场景和对象导航基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371391/

    相关文章:

    ios - 最佳iphone 3d游戏引擎

    c++ - 矩阵变换问题——Z轴旋转是倾斜的

    python - 裁剪具有相同宽高比的旋转图像

    opengl - 为什么有些OpenGL参数取0.0-1.0?

    c - glutPostRedisplay() 并不总是被调用?

    python - 在 opengl/pycuda 中可视化 n 维标量场

    opengl - 旧游戏渲染的最佳 OpenGL 剔除方法?

    html - 如何在关键帧期间重置每个之间的原点时进行 2+ 次旋转?

    css - 绕垂直轴旋转 45 度元素

    来自模型 View 矩阵的 openGL 位置和方向