X,Y,Z坐标标准?


12

尽管如此,我对任何类型的3D开发都是新手。通过阅读教程和示例,我发现X / Y / Z坐标似乎比我的第一个猜测要落后一些。

我曾想像过,如果一个人在田野上行走,他们的X / Y位置会发生变化,如果他们要跳,爬或爬下山坡,那么他们的Z位置将会发生变化。我的假设似乎是错误的,因为在田野上行走似乎会改变X / Z,而在山上跳跃或上/下会改变Y。

1)我的观察正确吗?3D对我来说是新手,我可能没有适当考虑问题。

2)水平运动为X / Z和垂直运动为Y背后的逻辑是什么?

3)在XNA Framework中将X / Y用作水平运动而将Z /用作垂直运动对我来说会错吗?


左/右手坐标系。DirectX是左手,OpenGL中的默认值是右手。
乔纳森·康奈尔

Answers:


19

您的假设没有错:每个引擎对这些坐标的处理方式都不同。一般来说,X几乎总是东西轴,但是Y轴或Z轴是高度轴还是有变化的。据我了解,Quake 3,Source Engine和Torque引擎的Z值都最多。建模工具3DS Max也是如此。这并不少见。

拥有一个按重要性从大到小的顺序排列的坐标系是有意义的,因此将表示平面化为更少的维度更容易理解。例如,如果您的游戏设置在2D高度图上,则Z表示“向上”是有意义的,因为这样,您在3D世界地图中的X和Y坐标就直接与高度图上的X和Y坐标相匹配。另一方面,如果您主要考虑渲染方面(许多游戏引擎开发人员都这样做),则您习惯了X和Y作为屏幕坐标,因此添加第3轴自然会进出屏幕。

请使用最简单的方法,但是请注意,任何选择都是任意的,您可能需要在它们之间进行转换并在一个程序中使用多个坐标系。


我实际上更喜欢其他两个答案,但是由于这是公认的答案,因此请注意,将Y设置为垂直,将Z设置为屏幕是大多数3D硬件API(DirectX和OpenGL)正常工作的方式。如果您需要自己的系统,请注意这一点,因为可能需要翻译。(使用不当但始终如一的东西通常可以按需工作,因此可能是:))
James

1
从技术上讲,默认情况下,当您添加方向时,OpenGL会在屏幕上显示Z,因此尽管它和DirectX的Z都平行于查看方向,但它们仍然不兼容!使用3D时,您需要具备通过旋转,平移和缩放从一个坐标系转到另一个坐标系的能力-的确,这就是模型在世界上最终的结果-因此,没有太多要点与模型的任何概念联系在一起标准。
Kylotan

只是指出一点,在处理数百万个三角形时,也许与硬件的coordiante系统战斗所需要做的事越少越好;)总而言之,尽管压力很大,制作游戏还是很有趣的。 )
詹姆斯

进入/离开屏幕或处于高度的“ Z”概念有些误导。概念化转换可能更容易。我们提交3D / 4D顶点坐标,该坐标最终转换为2D窗口空间,但具有深度值。API固有地将X,Y或Z的3D坐标映射为“深度”的想法是不正确的-您可以提出可以互换坐标含义的任何转换。转换结束后,您仍将获得2D窗口空间坐标和深度值。
PatrickB 2011年

1
我不能完全确定我们在其他方面有何不同:当然,只要最终可以投影到x,y,深度,您就可以使用所需的任何坐标空间,但是这个问题主要是关于为什么存在某些约定的问题坐标系,这些约定不可避免地与现实世界的概念相关联。
Kylotan

6

想象一下,看看前面伸出的一张纸,上面有一张图表,这些轴通常在底部标记为X,在垂直方向标记为Y;这使Z成为沿着地面的向外轴。

这只是一个约定,但是在图形中使用了很多,我们将Z视为场景的深度。

在其他领域,例如CAD,您的版本会更常见。


4

这个想法是x和y轴保持不变-y在屏幕上为“上”,x在其上。

z-第三维,投影回到屏幕中(在此忽略惯用性问题)。在3个维度上,这有点奇怪,但是对于在屏幕空间中定位事物而言,这更有意义。

3)如果可以,可以,但是会很痛苦而且笨拙。我建议您只习惯于Z项目进入/退出显示器。


1

1)是的,您的观察是正确的。

2)当您以第一人称射击者的角度进行思考时,当您使用空白(身份)转换矩阵通过场景中的角色的眼睛进行查看时,标准的全局XYZ坐标系才有意义。就像在纸上绘制坐标系一样,X指向右侧,Y指向上方。根据右手规则(x->拇指,y->食指,z->中指),Z指向您。

3)没错,但这将偏离标准。目前,我可以想到三个问题:(a)假设有一天您想使用一个使用标准坐标系的物理库。如果您不遵循标准,那么现在您必须考虑将您从世界带到物理世界的转变。当您要修复错误时可能会很烦。(b)当您想与某人共享代码或带某人帮助开发时,他们必须习惯于您的习惯。(c)使用标准3D模型时,您始终必须在其上方进行转换,以防止它们朝侧面看。

现在添加到问题2,将X,Y和Z不仅视为三个字母,而且将其视为正确,向上和向后也是很有用的。场景中的每个角色都有一个附加的局部坐标系,并且在它们的局部坐标系中X始终是正确的,Y一直是向上的,Z是向后的。一旦有了这些,现在就可以理解打印出的向量,或者以有意义的方式编写算法。假设您有两个字符A和B,并且如果其中一个面对另一个,则想要执行某项操作。您可以简单地在A的坐标系(Ta ^ -1 * p_b)中找到B的位置,查看获得的向量,看看Z(向后)是否为负,X(向右)和Y(向上)是否小,因为该向量告诉您B相对于A的向后和向右偏移了多少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.