坐标转换专题
1.屏幕坐标(Screen Point)
屏幕坐标是指当屏幕的分辨率确定后,屏幕上的一点的坐标,左下角为(0,0),右上角即屏幕的分辨率的宽、高。可以用以下方式确定
1)在Game的屏幕的分辨率处查看,其右上角的屏幕坐标即屏幕分辨率的宽高
![](https://img2020.cnblogs.com/blog/1869044/202102/1869044-20210204141327512-10659221.png)
2)(Camera.Main.pixelWidth,Camera.Main.height),这个坐标也是屏幕右上角的屏幕坐标
3) (Screen.Width,Screen.Height)和(Camera.Main.pixelWidth,Camera.Main.height)
2.画布的款宽纵比(PixcelRect)
Canvas.PixelRect记录的Canvas的分辨率信息
屏幕分辨率与Canvas分辨率的联系与区别: 在Overlay模式下,该Canvas分辨率的宽纵比和屏幕的宽纵比相等; 1)Canvas Scaler为Contant Pixcel Size时,但是PixcelRect的宽高并不等于屏幕的宽高 2)Canvas Scaler为Scale With Screen Size时,Pixcel的宽高并不一定等于屏幕的宽高,因为它会依照屏幕的宽纵比,并结合参考分辨率进行Canvas的比例缩放; |
2.世界坐标转换为屏幕坐标
Public void Camera.Main.WorldToScreenPoint(Vector3 positon) 将世界空间的坐标转换为屏幕坐标
屏幕空间以像素为单位定义。屏幕的左下角是(0,0); 右上角是(Camera.pixelWidth,Camera.pixelHeight)。z位置以相机的世界单位为单位。
代码示例:(在二维画布上,让角色的血条总是显示在角色的头顶之上)
前提:需要将UI的锚段设置在Canvas的左下角
7
1
pubilc void SetUIToRole(vector3 rolePos)
2
{
3
float scaleRateHeight = 1.0F * canvas.pixelRect.height/ Screen.height;
4
float scaleRateWidth = 1.0F * canvas.pixelRect.width / Screen.Width;
5
Vector3 screenPos = Camera.main.WorldToScreenPoint(rolePos);
6
rect.anchoredPosition =new Vector3(screenPos.x * scaleRateWidth,screenPos.y*scaleRateHeight,0);
7
}
Tips:因为WorldToScreenPoint转的是屏幕的坐标(实际是摄像机照射的视野分辨率坐标),但是摄像机的分辨率和画布的分辨率是存在差异的,例如,我将屏幕的分辨率调整为1920X1080(这是Screen.WidthXScreen.Height),但是我的Canvas的分辨率设置为(1334X750,在Canvas的模式为Scale with Screen Size模式下);这时摄像机的分辨率实际是比画布的分辨率大的,所以要将画布分辨率除以摄像机的分辨率,以获得一个较小的系数,在乘以转换后的屏幕坐标,以得到UI在画布上显示的准确位置;
3.屏幕坐标转世界坐标
1
public Vector3 ScreenToWorldPoint(Vector3 position);
注意:
1)Camera在正交模式下(Perspective),.转换后的世界坐标的Z轴(蓝)将与主摄像机的蓝轴值相等
所以这时如果你希望将转换后的坐标覆给某个你希望看到目标,你需要给这个坐标加上一个z方向的偏移
4.屏幕坐标转矩形局部坐标
RectTransformUtility(class)(RectTransformFromUntility.ScreenPointToLocalPointInRectangle)
5.局部坐标(Vector3)=>转世界坐标(Vector3)
1
Vector3 Transform.Transpoint(Vector3 v)
含义:将以Transform为局部参考系的局部坐标V转换成世界坐标
局部坐标的参考系:Tranform
待转换的局部坐标: v
转换后的世界坐标:返回值
用途:希望在一个UI物体A的相对位置产生一个另一个UI物体B,产生的物体B与该物体A无子父级关系
由于UI的Position值只能直接使用,却无法计算它的相对位置,所以可以先计算要产生的位置在A物体同级下的坐标,然后将计算后的同级坐标转换为世界坐标,给物体B即可
即:
1
B.transform.position=A.transform.parent.Transpoint(A.transform.localPosition+new Vector3(x,x,x));
其中,new Vector3(x,x,x)就是产生的B与A的绝对偏移