一 :3d空间坐标系 x,y,z 轴
z轴方向确定有两种方式 左手坐标系和右手坐标系
左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
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的子物体的本地坐标
获得 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的位置是以世界单位衡量的到相机的距离