大家好,欢迎来到IT知识分享网。
一、左手坐标系
所谓左手坐标系,指的是通过左手来确定的一个三维空间坐标系。
1.1 确定左手坐标系的方式
下面总结了三种可以确定左手坐标系的方法。
1.1.1 拇指、食指、中指相互垂直确定法
如图,伸出左手,拇指朝上代表Y轴、食指朝前代表Z轴、中指朝右代表X轴。注意,中指这个时候是只能往右边弯曲的。
1.1.2 左手定则确定法
伸出左手,手指朝着右边X轴,握向Y轴,这个时候拇指指向的方向就是Z轴(朝前)。
1.1.3 人站立的正面朝向确定法
人朝前站立着,右手伸出的朝向是X轴,头顶的方向是Y轴,面向Z轴。
1.2 左手定则
二、右手坐标系
2.1 确定右手坐标系的方式
2.1.1 拇指、食指、中指相互垂直确定法
2.1.2 左手定则确定法
伸出右手,手指朝着右边X轴,握向Y轴,这个时候拇指指向的方向就是Z轴(朝后)。
2.1.3 人站立的正面朝向确定法
人朝前站立着,右手伸出的朝向是X轴,头顶的方向是Y轴,背后的是Z轴。
2.2 右手定则
三、图形API的左右手坐标系
图形管线中,存在多个坐标系,每个坐标系都可以使用左手或者右手坐标系。下面按照,物体坐标系->世界坐标系->摄像机坐标系->裁剪坐标系->窗口坐标系来说明。
3.1 OpenGL
OpenGL默认是右手坐标系。不过到了窗口坐标系,OpenGL使用的是左手坐标系。为什么了?因为OpenGL的深度范围是[0,1],而且是摄像机越远,深度越大,这就是左手坐标系啦。
由于物体坐标系、世界坐标系、摄像机坐标系都是右手坐标系,但是窗口坐标系是左手坐标系,那么投影矩阵就需要乘以右手坐标系变换到左手坐标系这个变换,也就是Z变换成-Z。不过这个变换也可以放在摄像机坐标系,也就是MVP的V中。现在假定,都乘到P中了。
最终结论是:物体坐标系、世界坐标系、摄像机坐标系是右手坐标系;裁剪坐标系和窗口坐标系是左手坐标系,窗口坐标系实际上只是裁剪坐标系进行齐次除法后再平移缩放而已。
3.2 DirectX
3.3 Vulkan
Vulkan的窗口坐标系和DirectX的一致,因此推测其余坐标系和DirectX的一致。
3.4 Metal
Vulkan的窗口坐标系和DirectX的一致,因此推测其余坐标系和DirectX的一致。
看来只有,历史遗留的奇葩OpenGL的窗口坐标系,原点在左下角啊。原点在哪,这个跟纹理的v坐标是否需要取反也有关系。
四、游戏引擎的左右手坐标系
游戏引擎中,物体和世界坐标系是固定的,对于所有的图形API都会一样。
4.1 Unity
根据上图,Unity的物体和世界坐标系可以推测都是左手系。
根据上图,出自Unity Shader入门精要,Unity的窗口坐标系和OpenGL的一致,是左手系。但是摄像机空间变换到了右手系。那么,在V中需要乘以Z到-Z的变换。同时,P中再乘以-Z到Z的变换变回左手系。
为啥多次一举了,怀疑这个结论的正确性。下面做实验,用IMGizmos绘制坐标轴。代码如下,
using UnityEngine; namespace GYGame { /// <summary> /// 出生点 /// </summary> public class PlayerStart : MonoBehaviour { public float GizmosHeight { get; set; } = 2.0f; void OnDrawGizmos() { IMGizmos.Line3D(transform.position, transform.position + transform.up * GizmosHeight, Color.green); IMGizmos.Line3D(transform.position, transform.position + transform.right * GizmosHeight, Color.red); IMGizmos.Line3D(transform.position, transform.position + transform.forward * GizmosHeight, Color.blue); } } }
4.2 UnrealEngine
虚幻和Unity一样也是采用左手坐标系,不过其是Z轴朝上,Y轴朝外。沿着X轴旋转90度,可以得到Z轴朝内,Y轴朝上,那么和Unity的是一致的。
推测,其余的空间的坐标系旋向和Unity的是一致。摄像机空间的旋向也可以用类似4.1的方式绘制Gizmos,然后选中摄像机,查看摄像机的绘制结果。
五、参考资料
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136790.html