视口坐标转世界坐标

[HideInInspector]
    public float leftBorder;
    [HideInInspector]
    public float rightBorder;
    [HideInInspector]
    public float topBorder;
    [HideInInspector]
    public float downBorder;
    private float width;
    private float height;
    void Start()
    {
        //世界坐标右上角 = 相机右上角 1, 1点转换成的
        Vector3 cornerPos = Camera.main.ViewportToWorldPoint(new Vector3(1f, 1f,
            Mathf.Abs(-Camera.main.transform.position.z)));
        //世界坐标的左上角位置 = 视口坐标x0点位置 - (世界坐标x位置(右上角)-视口坐标0的位置) 
        leftBorder = Camera.main.transform.position.x - (cornerPos.x - Camera.main.transform.position.x);
        rightBorder = cornerPos.x;
        topBorder = cornerPos.y;
        downBorder = Camera.main.transform.position.y - (cornerPos.y - Camera.main.transform.position.y);

        width = rightBorder - leftBorder;
        height = topBorder - downBorder;

        Debug.Log(cornerPos);
        Debug.Log(Camera.main.transform.position.x);
        Debug.Log(leftBorder);
        Debug.Log(rightBorder);
        Debug.Log(topBorder);
        Debug.Log(downBorder);
        Debug.Log(width);
        Debug.Log(height);

        
    }

using UnityEngine; /// <summary> /// 坐标转换工具 /// </summary> public static class CCUtils { /// <summary> /// 世界坐标屏幕坐标 /// </summary> public static Vector2 World2Screen(Vector3 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 worldPos = v; Vector3 pos = camera.WorldToScreenPoint(worldPos); return pos; } /// <summary> /// 屏幕坐标世界坐标 /// </summary> public static Vector3 Screen2World(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 screenPos = new Vector3(v.x, v.y, -camera.transform.position.z); Vector3 pos = camera.ScreenToWorldPoint(screenPos); return pos; } /// <summary> /// 世界坐标坐标 /// </summary> public static Vector2 World2Viewport(Vector3 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 worldPos = v; Vector3 pos = camera.WorldToViewportPoint(worldPos); return pos; } /// <summary> /// 坐标世界坐标 /// </summary> public static Vector3 Viewport2World(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 viewportPos = new Vector3(v.x, v.y, -camera.transform.position.z); Vector3 pos = camera.ViewportToWorldPoint(viewportPos); return pos; } /// <summary> /// 屏幕坐标坐标 /// </summary> public static Vector2 Screen2Viewport(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 screenPos = v; Vector3 pos = camera.ScreenToViewportPoint(screenPos); return pos; } /// <summary> /// 坐标屏幕坐标 /// </summary> public static Vector2 Viewport2Screen(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 viewportPos = v; Vector3 pos = camera.ViewportToScreenPoint(viewportPos); return pos; } /// <summary> /// 屏幕坐标UI坐标 /// </summary> public static Vector2 Screen2UI(Vector2 v, RectTransform rect, Camera camera = null) { Vector2 pos; RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, v, camera, out pos); return pos; } /// <summary> /// 世界坐标UI坐标 /// </summary> public static Vector2 World2UI(Vector3 v, RectTransform rect, Camera uiCamera, Camera worldCamera = null) { if (worldCamera == null) { worldCamera = Camera.main; } Vector2 screenPos = World2Screen(v, worldCamera); Vector2 pos = Screen2UI(screenPos, rect, uiCamera); return pos; } }和世界空间与局部空间换 InverseTransformPoint和TransformPoint 例如物体A的世界坐标坐标为(1,2,3),物体B的世界坐标为(2,2,2),现在需要计算物体B相对于物体A的局部坐标,则应该使用A.transform.InverseTransformPoint(B)屏幕坐标世界坐标 Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z)); Debug.Log(screenToWorld); 世界坐标屏幕坐标 Vector3 worldToScreen = Camera.main.WorldToScreenPoint(transform.position); Debug.Log(worldToScreen); 屏幕坐标坐标 Vector3 mousePos = Input.mousePosition; Vector3 screenToViewport = Camera.main.ScreenToViewportPoint(mousePos); Debug.Log(screenToViewport); 坐标屏幕坐标 Vector3 viewportToScreen = Camera.main.ViewportToScreenPoint(new Vector3(1, 1, 0)); Debug.Log(viewportToScreen); 世界坐标坐标 Vector3 worldToViewport = Camera.main.WorldToViewportPoint(transform.position); Debug.Log(worldToViewport); 坐标世界坐标 Vector3 viewportToWord = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, -Camera.main.transform.position.z)); Debug.Log(viewportToWord); 如何使用这几段代码用unity从零开始,从新建项目开始告诉我,该怎么执行怎么操作,新建哪些内容可以完成不同坐标系之间的坐标转换,给定一个实际的坐标值,完成坐标转换
最新发布
10-30
根据下面的内容完成不同坐标系之间的坐标转换,给定一个实际的坐标值,完成坐标转换并附截图说明。 从unity新建项目开始告诉我,该怎么操作怎么执行,新建哪些内容,每一步都要详细的步骤 世界空间与局部空间换 InverseTransformPoint和TransformPoint 例如物体A的世界坐标坐标为(1,2,3),物体B的世界坐标为(2,2,2),现在需要计算物体B相对于物体A的局部坐标,则应该使用A.transform.InverseTransformPoint(B)屏幕坐标世界坐标 Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z)); Debug.Log(screenToWorld); 世界坐标屏幕坐标 Vector3 worldToScreen = Camera.main.WorldToScreenPoint(transform.position); Debug.Log(worldToScreen); 屏幕坐标坐标 Vector3 mousePos = Input.mousePosition; Vector3 screenToViewport = Camera.main.ScreenToViewportPoint(mousePos); Debug.Log(screenToViewport); 坐标屏幕坐标 Vector3 viewportToScreen = Camera.main.ViewportToScreenPoint(new Vector3(1, 1, 0)); Debug.Log(viewportToScreen); 世界坐标坐标 Vector3 worldToViewport = Camera.main.WorldToViewportPoint(transform.position); Debug.Log(worldToViewport); 坐标世界坐标 Vector3 viewportToWord = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, -Camera.main.transform.position.z)); Debug.Log(viewportToWord); 任何一个坐标世界坐标时,z的参数都应该为相机在世界坐标中z的负值 从世界坐标到任何一个坐标时,计算出的z值都是相机的世界坐标中z轴的负值 using UnityEngine; /// <summary> /// 坐标转换工具 /// </summary> public static class CCUtils { /// <summary> /// 世界坐标屏幕坐标 /// </summary> public static Vector2 World2Screen(Vector3 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 worldPos = v; Vector3 pos = camera.WorldToScreenPoint(worldPos); return pos; } /// <summary> /// 屏幕坐标世界坐标 /// </summary> public static Vector3 Screen2World(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 screenPos = new Vector3(v.x, v.y, -camera.transform.position.z); Vector3 pos = camera.ScreenToWorldPoint(screenPos); return pos; } /// <summary> /// 世界坐标坐标 /// </summary> public static Vector2 World2Viewport(Vector3 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 worldPos = v; Vector3 pos = camera.WorldToViewportPoint(worldPos); return pos; } /// <summary> /// 坐标世界坐标 /// </summary> public static Vector3 Viewport2World(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 viewportPos = new Vector3(v.x, v.y, -camera.transform.position.z); Vector3 pos = camera.ViewportToWorldPoint(viewportPos); return pos; } /// <summary> /// 屏幕坐标坐标 /// </summary> public static Vector2 Screen2Viewport(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 screenPos = v; Vector3 pos = camera.ScreenToViewportPoint(screenPos); return pos; } /// <summary> /// 坐标屏幕坐标 /// </summary> public static Vector2 Viewport2Screen(Vector2 v, Camera camera = null) { if (camera == null) { camera = Camera.main; } Vector3 viewportPos = v; Vector3 pos = camera.ViewportToScreenPoint(viewportPos); return pos; } /// <summary> /// 屏幕坐标UI坐标 /// </summary> public static Vector2 Screen2UI(Vector2 v, RectTransform rect, Camera camera = null) { Vector2 pos; RectTransformUtility.ScreenPointToLocalPointInRectangle(rect, v, camera, out pos); return pos; } /// <summary> /// 世界坐标UI坐标 /// </summary> public static Vector2 World2UI(Vector3 v, RectTransform rect, Camera uiCamera, Camera worldCamera = null) { if (worldCamera == null) { worldCamera = Camera.main; } Vector2 screenPos = World2Screen(v, worldCamera); Vector2 pos = Screen2UI(screenPos, rect, uiCamera); return pos; } }
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值