Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

一 :3d空间坐标系  x,y,z 轴

z轴方向确定有两种方式 左手坐标系和右手坐标系

左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

  Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

3D笛卡尔坐标系:右手坐标系

OpenGL:右手坐标系

Direct3D:左手坐标系

Unity3D:左手坐标系(世界坐标系),即+x, +y, +z分别指向右方,上方和前方。

二:Unity 中的坐标系

1:全局坐标系  World Coordinate System  世界坐标

全局坐标系中的坐标原点(0,0,0)

Transform.position 获得一定是全局坐标

2:局部坐标系  Local Coordinate System  模型坐标系 或者物体坐标系

物体自身独立的物体坐标系。当物体移动或改变方向时,和该物体相关联的坐标系将随之移动或改变方向。

模型Mesh保存的顶点坐标均为局部坐标系下的坐标。

transform.localPosition(本地坐标)可以获得物体在父物体的局部坐标系中的位置点。

父子关系,子物体以父物体的坐标点为自身的坐标原点。

如果该游戏物体没有父物体,那么transform.localPosition获得的依然是该物体在全局坐标系中的坐标。

如果该物体有父物体,则获得是在其父物体的局部坐标系中的坐标。

检视视图中显示的为localPosition的值。

3: 屏幕坐标系  Screen Space

屏幕坐标系是建立在屏幕上的二维坐标系。以像素来定义的,屏幕的左下角为(0,0),右上角为(Screen.width, Screen.height),z轴的坐标是相机的世界坐标中z轴坐标的负值。

鼠标位置坐标属于屏幕坐标,通过Input.mousePosition可以获得该位置的坐标。

手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕时手指的坐标。

4:视口坐标系  ViewPort Space  

计算的时候不用考虑实际屏幕大小 (比如让一个点一直再屏幕内可以使用视口坐标判断)

视口坐标系是将Game视图的屏幕坐标系单位化,左下角(0,0),右上角(1,1)。z轴的坐标是相机的世界坐标中z轴坐标的负值。

三:坐标系之间的转换

1.全局坐标系和局部坐标系

transform.Translate(translation:Vector3); 沿着局部坐标系轴移动  默认为局部坐标系

transform.Translate(translation:Vector3, relativeTo: Space = Space.Self); 沿着世界坐标系轴移动

Transform.TransformPoint(Vector3 position)  将一个坐标点从局部坐标系转换到全局坐标系

Transform.InverseTransformPoint(Vector3 position):将坐标点从全局坐标系转换到局部坐标系。

//将一个坐标点从局部坐标系转换到全局坐标系 只能转换 transform本物体下的坐标系下的位置到世界坐标 

A 是Transform ,position 是和b同级的a的子物体的本地坐标

Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

 

获得 c2作为c1的子物体 的localposition     c2.position - c1.position

世界坐标的差值是 c2 相对c1的位置偏移  那么这个位置偏移是一直存在的,就是在c1 作为父物体c2的坐标原点的时候 c2的坐标就是这个差值 所以 c2的localposition 才是两个世界坐标相减当一个物体变成另一个物体的子物体之后inspector面板上的坐标位置 就是相对位置了

2.屏幕坐标系与全局坐标系

Camera.ScreenToWorldPoint(Vector3 position): 将屏幕坐标转换为全局坐标。

Camera.WorldToScreenPoint(Vector3 position):将全局坐标转换为屏幕坐标。

Input.mousePosition:获得鼠标在屏幕坐标系中的坐标。

相机是一个视椎体 属性 这样会有问题一直是(x,y,0) 会变成摄像机的位置 z到摄像机平面可以获得无数个平行的屏幕矩形离摄像机越远,矩形越大,离摄像机越近,矩形越小  Z的位置是以世界单位衡量的到相机的距离

Vector3 mousePos = Input.mousePosition()

Vector3 stow= Camera.ScreenToWorldPoint(Vector3(mousePos.x,mousePos.y,camera.nearClipPlane) )  

3.屏幕坐标系与视口坐标系

Camera.ScreenToViewportPoint(Vector3 position):将屏幕坐标转换为视口坐标。

Camera.ViewportToScreenPoint(Vector3 position):将视口坐标转换为屏幕坐标。

4.全局坐标系与视口坐标系

Camera.WorldToViewportPoint(Vector3 position):将全局坐标转换为视口坐标。

Camera.ViewportToWorldPoint(Vector3 position):将视口坐标转换为全局坐标。 camera.nearClipPlane Z的位置是以世界单位衡量的到相机的距离

上一篇:Unity 用鼠标拖动3D物体 跟随鼠标移动


下一篇:Unity在地球上放置物体时使物体垂直于地面的实现