笔记——三维世界坐标和二维画布/屏幕坐标转换

 1、世界坐标转屏幕坐标

    /// <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、三维位置实时映射到二维画布上

三维地图上某位置坐标,映射到屏幕画布上显示,在画布上的位置随三维沙盘移动而动;

    /// <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、二维画布坐标转三维沙盘坐标

    /// <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、鼠标点击屏幕的点/鼠标位置转换为世界坐标

    //通过射线检测,获取鼠标点击位置的世界坐标
    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;
        }
    }

    //直接把鼠标位置转化为世界坐标
    public void GetMousePos () {
        //获取鼠标在屏幕上的坐标
        Vector3 mousePosition = Input.mousePosition; 

        //屏幕坐标转世界坐标,z轴值不能为0,否则转换失败
        Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint (new Vector3(mousePosition.x, mousePosition.y, 10.0f)); 
    }

猜你喜欢

转载自blog.csdn.net/weixin_43908355/article/details/124302687
今日推荐