OpenGL轴约定

OpenGL轴约定,opengl,camera,coordinates,axis,Opengl,Camera,Coordinates,Axis,我写一个图形引擎是为了好玩。我陷入了一个很深的传统问题 我知道默认的OpenGL轴约定,X+是正确的,Y+是顶部,Z-是你在屏幕上看到东西的方式。为了清楚起见,在不接触默认配置的情况下,如果我想看到某个东西,我需要在Z中绘制它-在世界上,如果我在Z+中绘制它,它将“在相机后面”。我想坚持那个惯例 另一方面,对于对象,在其局部轴上,我也使用X+表示右侧,y+表示顶部,但Z+表示前部。所以如果我画一个人,他的眼睛看着Z+。我也喜欢这个惯例,但我不确定,因为我们渲染世界的方式有点奇怪,毕竟它很好 现在

我写一个图形引擎是为了好玩。我陷入了一个很深的传统问题

我知道默认的OpenGL轴约定,X+是正确的,Y+是顶部,Z-是你在屏幕上看到东西的方式。为了清楚起见,在不接触默认配置的情况下,如果我想看到某个东西,我需要在Z中绘制它-在世界上,如果我在Z+中绘制它,它将“在相机后面”。我想坚持那个惯例

另一方面,对于对象,在其局部轴上,我也使用X+表示右侧,y+表示顶部,但Z+表示前部。所以如果我画一个人,他的眼睛看着Z+。我也喜欢这个惯例,但我不确定,因为我们渲染世界的方式有点奇怪,毕竟它很好

现在,这是我真正的问题。当谈到使用灯光(和阴影贴图)时,我将以聚光灯为例。我应该使用Z+还是Z-来指向光线

因为这是诀窍。如果我想使用阴影贴图技术,我们有灯光本身和一个“摄影机”来将东西绘制到阴影贴图中,我尝试坚持一个统一的“摄影机”约定,无论我渲染什么(默认帧缓冲区,效果或阴影贴图的离屏渲染)

最后,我使用Z-for-ray来按照摄影机的惯例生成灯光。但真的,这让我很烦恼。我仍然可以遵循这个惯例,但当它创建一个类似lookAt()的函数时,它很奇怪,基本网格将正确地“注视”,但灯光将反转。。。最后,如果我想要一个模型来具体化我的聚光灯呢?整个结构有点糟糕


我的基本问题是,对于基本模型/网格渲染、摄影机渲染场景和定向/聚光灯发射,我应该使用的最佳约定是什么?

是的,整个管道都很混乱。如果你看不清右手坐标系和世界空间(Z-)是如何相互关联的,你可以试着像这样可视化它。假设右侧坐标系是一个带有地图坐标的2D绘图,因此Y轴指向北方,x轴指向东方,而“向上”轴(垂直于2D绘图)因此不在屏幕上。然后想象一下从地球发射的火箭,你会假设上升方向是Z+

因此,当事物“低于”摄影机或负z,并且处于“世界空间”时,它们就会出现在摄影机上。所以,当摄像机离得更远时,它的z位置正增加是有意义的,因为它是在相对论意义上工作的。定义灯光位置和对象位置但是,使用Z+更有意义,因为它们是重要的功能

但是,当从世界空间转到视图空间时,投影矩阵会反转Z轴,以便正确的Z缓冲区深度测试/片段剔除按预期工作(即,前面的像素在正Z方向上更远),但不能确切确定这是否有意义


编辑:这是我目前的工作知识,显然仍有一些缺陷,但如果它开启了一场讨论,让我们都能学到一些东西,我会发现它是值得的:)

我仍然没有完全掌握的东西。。。如果将摄影机放置在(0,0,0)位置,并且对象沿Z轴平移,则其位置Z会随着摄影机视图中的收缩而变小。那么“向后移动摄影机”是否应该定义为向前移动整个场景的等价物,即沿Z轴移动?这有点有趣…是的,这就是问题所在,如果我想做一个类似FPS的游戏,例如,我的相机指向Z-,所以如果我想向前移动,我应该朝Z-。。。如果我有一些敌人,为了同质化,他们应该使用相同的约定。为了美观,我也重复使用节点坐标进行物理计算……好吧,我对这个问题理解得更好了,但仍然很不确定。我想我的答案的第二部分有点让人困惑,我想你的问题是,如果你不包括投影矩阵,为什么z=-1处的三角形会画在z=0处的三角形前面,我也试图理解/解释这个问题。当有太多的细节时,我知道是时候再次提起学习英语了:)听起来你有一个很好的系统,你的项目听起来很棒,物理也很棒,我很想在它完成时看到它。但是要补充的是,是的,我想在FPS中,向前移动将是z递减的,在你的渲染器坐标系中,与敌人一样,但是你可以建立一个矩阵,当你在上面建立游戏层的时候,为了方便,可以将其反转,甚至可以转换成z-up,x-y地平面,这样游戏编程就更容易理解了。因为z作为深度显然是历史定义的,除了“它总是这样做”之外,没有太多的实际需要。我讨厌z穿过屏幕,更糟糕的是z向前。