1、3d世界坐标转2d屏幕坐标
(1)从世界空间转到屏幕空间
Vector2 pos = Camera.WorldToScreenPoint(Vector3);
(2) 从屏幕空间转到UI所在的Canvas空间
//用于存储转化后输出的坐标
Vector2 anchoredPosition;
//将屏幕上坐标,转到画布UI上
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPosition, mainCanvas.worldCamera, out anchoredPosition);
(3)功能方法
/// <summary>
/// 世界坐标转屏幕坐标
/// </summary>
/// <param name="parentRect"></param>
/// <param name="worldPoint">世界坐标下的三维点位</param>
/// <param name="offset">偏差值</param>
/// <returns>目标二维坐标值</returns>
public Vector2 WorldPosToScreenPos(RectTransform parentRect,Vector3 worldPoint,Vector2 offset)
{
Vector2 anchoredPosition;
Vector2 screenPosition = mainCamera.WorldToScreenPoint(worldPoint);
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPosition, mainCanvas.worldCamera, out anchoredPosition);
return anchoredPosition + offset;
}
2、世界场景下物体,实时映射到Canvas上
将3d地图上某位置坐标,映射到canvas上显示:
如:世界场景中的相机视野中有该物体,物体就显示在画布上,相机中没有该物体,则不显示;
/// <summary>
/// 三维地图上点,映射在屏幕画布上的poi点位的动态更新
/// </summary>
/// <param name="parentRect">点位的父物体</param>
/// <param name="rectTransform">点位本身</param>
/// <param name="point">点位对应三维沙盘上的位置</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
protected IEnumerator UpdatePosition(RectTransform parentRect, RectTransform rectTransform, Vector3 point, Vector2 offset)
{
Vector2 anchoredPosition;
while (true)
{
//三维沙盘上的位置对应画布上的位置
Vector2 screenPosition = mainCamera.WorldToScreenPoint(point);
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPosition, mainCanvas.worldCamera, out anchoredPosition);
rectTransform.anchoredPosition = anchoredPosition + offset;
yield return null;
}
}
——————————————— 2022-04-23———————————————————
3、2d画布坐标转3d沙盘坐标
通过射线检测的方式实现。
(1)从屏幕上某点往世界发射射线:
Ray ray = mainCamera.ScreenPointToRay(targetPos2d);
(2)获取射线路径上碰到的物体:
Ray ray = mainCamera.ScreenPointToRay(Vector2); //屏幕上某点发出射线
RaycastHit hit; //接收射线碰到的物体对象
Physics.Raycast(射线, out hit, 射线长度);
Ray ray = mainCamera.ScreenPointToRay(targetPos2d);
RaycastHit hit;
//射线检测,第三个参数可根据需求设置或不设置,具体看api;
Physics.Raycast(ray, out hit, 500000);
(3)功能方法
/// <summary>
/// 二维画布坐标转三维沙盘坐标
/// </summary>
/// <param name="targetPos2d"></param>
/// <returns></returns>
public Vector3 ScreenToWorldPos(Vector2 targetPos2d)
{
Ray ray = mainCamera.ScreenPointToRay(targetPos2d);
RaycastHit hit;
Physics.Raycast(ray, out hit, 500000);
return hit.point;
}
4、鼠标点击的2d屏幕位置转为3d世界坐标
(1)采用射线检测的方式实现
1)获取鼠标点击的2d位置
Vector2 mousePos =Input.mousePosition;
2)射线检测,获得世界位置
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Physics.Raycast(ray, out hit, 500000);//第三个距离参数可不设置
Vector3 mousePos = hit.point;
3)功能方法
//通过射线检测,获取鼠标点击位置的世界坐标
public void GetMouseWorldPos()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//射线检测,第三个参数可根据需求设置或不设置,具体看api;
Physics.Raycast(ray, out hit, 500000);
Vector3 mousePos = hit.point;
}
}
(2)直接把鼠标点击位置,转化为世界坐标
public void GetMousePos () {
//获取鼠标在屏幕上的坐标
Vector3 mousePosition = Input.mousePosition;
//屏幕坐标转世界坐标,z轴值不能为0,否则转换失败
Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint (new Vector3(mousePosition.x, mousePosition.y, 10.0f));
}