代码之家  ›  专栏  ›  技术社区  ›  341008 Sylvain

OpenGL坐标系是左手还是右手?

  •  81
  • 341008 Sylvain  · 技术社区  · 14 年前

    http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx http://www.falloutsoftware.com/tutorials/gl/gl0.htm ). 哪个是正确的?我知道我们可以通过镜像将一个转换为另一个,但我想知道默认坐标。

    5 回复  |  直到 12 年前
        1
  •  130
  •   bobobobo    11 年前

    这里有些混乱。

    enter image description here

    OpenGL是 在物体空间和世界空间。

    但是在窗口空间(又名屏幕空间),我们突然 左撇子 .

    ?

    从右手到左手的方法是在 glOrtho glFrustum

    enter image description here enter image description here

    远的 应该是肯定的 远的 近的 . 说 远的 =1。则C=—(1001)/(999)=-1.002。

    看到了吗 here

    从一个 正射透视 ,格洛托生成一个矩阵:

    enter image description here

    左边 正确的 顶部 只是 the coordinates for left vertical , right vertical , bottom horizontal , top horizontal clipping planes (resp) .

    这个 近的 远的 但是飞机, 有不同的规定 . 这个 近的 参数定义为

    • 距离 到较近的深度剪切平面。如果飞机要在观察者后面,则此距离为负。

    而且远:

    • zFar公司 距离

    canonical

    减号有效地将z按-1缩放 左手左转 在视图转换过程中,大多数人并不知道,因为他们只是在OpenGL中作为一个“右手”坐标系工作。

    所以,如果你打电话

    glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
    

    你前面10个单位 负z轴 "By default, the camera is situated at the origin, points down the negative z-axis, and has an up-vector of (0, 1, 0)." ). 所以近平面是z=-10。远点的飞机是 你身后10个单位,z=+10

        2
  •  25
  •   Community CDub    7 年前

    默认情况下,标准化设备坐标为左手坐标。

    glDepthRange默认为[0,1](near,far),使+z轴指向屏幕,+x向右,+y向上,这是一个左手系统。

    引用以前的 answer from Nicol :(罢工通过是我的工作,解释如下)

    我很惊讶没有人提到这件事:OpenGL也在左手坐标系中工作。至少,当使用着色器并使用默认深度范围时,它会起作用。

    一旦抛出固定函数管道,就直接处理“剪辑空间”。OpenGL规范将剪辑空间定义为4D齐次坐标系。当您通过标准化的设备坐标进行转换,并向下到窗口空间时,您会发现这一点。

    窗口空间是指窗口像素的空间。原点在左下角,+Y向上,+X向右。听起来很像右手坐标系。但是Z呢?

    默认深度范围(glDepthRange)将近Z值设置为0,将远Z值设置为 离开 从观众那里。

    将深度测试从GL_LESS更改为GL_GREATER and 违约 左撇子 坐标系。从剪辑空间到窗口空间所需的任何变换都不会否定Z。所以剪辑空间,顶点(或几何体)着色器的输出是左手空间(有点像)。这是一个4D同质的空间,所以很难确定用手习惯)。

    在固定函数管道中,标准投影矩阵(由glOrtho、glFrustum等生成)都从右手空间转换为 左撇子 一个。它们颠倒了Z的含义,只需检查它们生成的矩阵。在眼睛空间,+Z向观看者移动;在投影后空间,它移动。

    我怀疑微软(和GLide)根本就不想在他们的投影矩阵中执行否定运算。

    我确实找到了一部分,因为它与我的发现有出入。

    要么改变脱党

        3
  •  13
  •   Lukas Kalbertodt    5 年前

    仅NDC

    你应该注意到 OpenGL只知道NDC!

    无论使用什么坐标系——左手坐标系还是右手坐标系——都需要镜像到NDC。如果你愿意,你完全可以把世界空间当作左手坐标系来处理。

    为什么我们在世界空间中通常使用右手坐标系?

    我觉得这很传统。就是这样。也许它只是想区别于DirectX。

        4
  •  7
  •   Heinzlmaen    10 年前

    书中说:

    • 实际上,大多数人使用右手系统

    • OpenGl实际上是一个左手系统

    • 从内部来说,更深层次来说,两者都不是。在最底层,OpenGl并不关心z值。你画东西的顺序决定了在上面画什么(先画一个三角形,然后画一个四边形,四边形覆盖三角形)。

    我不完全同意“两者都不是”的说法,但这可能是一个哲学问题。

        5
  •  3
  •   ForeignDevil    7 年前

    编辑:如果你不相信我,只要在你的顶点着色器中添加一个转换矩阵,你就可以很容易地看到Opengl是否是左撇子。

        6
  •  0
  •   weatx    5 年前

    通过使用OpenGL内置的投影和变换函数,观察屏幕上的运动遵循 右手的 坐标系。例如,如果视图前面的对象沿z轴正方向平移,则该对象将向您移动。

    左撇子 坐标系。

    还有一个坐标系,那就是视口!视口的坐标系为+x指向右侧,+y指向下方。我认为在这一点上用手是没有意义的,因为我们现在只处理x,y。

    最后,引擎盖下的gluLookAt必须否定lookat向量。因为数学假设一个向量指向它正在看的对象的正方向,而摄影机向下看-z,所以必须对“注视”向量求反,以便它与摄影机对齐。