坐标转换专题

1.屏幕坐标(Screen Point)
屏幕坐标是指当屏幕的分辨率确定后,屏幕上的一点的坐标,左下角为(0,0),右上角即屏幕的分辨率的宽、高。可以用以下方式确定
    1)在Game的屏幕的分辨率处查看,其右上角的屏幕坐标即屏幕分辨率的宽高
    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的绝对偏移








posted @ 2021-02-04 14:10  章校长  阅读(212)  评论(0编辑  收藏  举报