Unity功能——3d世界坐标和2d画布/屏幕坐标转换

26 篇文章 5 订阅
15 篇文章 0 订阅

 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)); 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值