图片两维坐标到三维场景中的转换

 Unity中截图保存成全景图。

 public static byte[] Render2Panorama(Camera  cam = null,bool save =false)
    {
        //可修改数值   new RenderTexture(4096, 4096, 32);
        RenderTexture cubemap = new RenderTexture(2048, 2048, 16);
        cubemap.dimension = TextureDimension.Cube;
        cam.RenderToCubemap(cubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
        //可修改数值 new RenderTexture(4096, 4096, 32);
        RenderTexture equirect = new RenderTexture(1920, 1080, 8);
        cubemap.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono);

        RenderTexture.active = equirect;
        Texture2D tex = new Texture2D(equirect.width, equirect.height, TextureFormat.ARGB32, false, true);
        tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        RenderTexture.active = null;
        GL.Clear(true, true, Color.black);
        tex.Apply();
        byte[] bytes = tex.EncodeToJPG();
        // CreateDirectroryOfFile(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\全景图\\)");
        // System.IO.File.WriteAllBytes(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop)
        //                              + "\\全景图\\" + System.DateTime.Now.Ticks + ".tga", bytes);
        if (save)
        {
            string path = Path.Combine(Application.dataPath,"../","Panorama"); 
            if (!System.IO.Directory.Exists(path)) Directory.CreateDirectory(path);
            File.WriteAllBytes(path+ "/" + Time.time.ToString()+ ".jpg", bytes);
        }
        return bytes;
    }

 假定图片为2048*1024,坐标起始点为左下角。


public class uv计算坐标 : MonoBehaviour
{
    // Start is called before the first frame update
    public Vector2 uv;
    private Vector3[] _vertArr;
    private Vector2[] _uvArr;
    void Start()
    {
        uv = uv / new Vector2(2048, 1024);
        var mesh = GetComponent<MeshFilter>().mesh;
        _vertArr = mesh.vertices;
        _uvArr = mesh.uv;

        var index =FindClosestVector(uv);
        var pos = Uv2Pos(index);
        CreatePoint(pos);
    }


    

    public GameObject CreatePoint(Vector3 pos)
    {
        var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        go.transform.localScale = Vector3.one/10;
        go.transform.position = pos;
        go.name = pos.ToString();
        return go;
    }

    public Vector3  Uv2Pos(  int index)
    {
        var vr = _vertArr;
        return transform.TransformPoint(_vertArr[index]);
    }

    // Update is called once per frame
   
    public int FindClosestVector(  Vector2 target)
    {
        Vector2[] vectors = _uvArr;
        // Vector2 closestVector = vectors[0];
        int index = 0;
        float closestDistance = Vector2.Distance(vectors[0], target);

        for (int i = 1; i < vectors.Length; i++)
        {
            float distance = Vector2.Distance(vectors[i], target);
            if (distance < closestDistance)
            {
                // closestVector = vectors[i];
                closestDistance = distance;
                index = i;
            }
        }
        return index;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity,将三维坐标转换二维坐标需要使用Camera的ScreenToWorldPoint函数。该函数可以将屏幕上的点转换为世界坐标。 首先,你需要获取相机的引用。可以使用Camera.main来获取场景的主摄像机,或者通过其他方式获取你想要使用的摄像机。 然后,使用Camera.WorldToScreenPoint函数将目标三维坐标转换为屏幕坐标。这个函数接受一个Vector3参数,表示世界坐标。例如,如果你有一个名为targetPosition的Vector3变量,你可以这样调用函数: ```csharp Vector3 screenPoint = Camera.main.WorldToScreenPoint(targetPosition); ``` 这将把目标位置从世界坐标转换为屏幕坐标系。 最后,如果你需要将屏幕坐标转换为UI坐标(Canvas坐标),你还需要考虑到Canvas的缩放因素。可以使用RectTransformUtility.ScreenPointToLocalPointInRectangle函数将屏幕坐标转换为UI坐标。这个函数接受一个RectTransform参数,表示UI元素的RectTransform组件,以及一个屏幕坐标。 例如,如果你有一个名为canvas的Canvas对象,并且有一个名为uiElement的UI元素,你可以这样调用函数: ```csharp Vector2 localPoint; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, screenPoint, Camera.main, out localPoint); ``` 现在,localPoint将包含UI元素的坐标,可以在Canvas上使用它来定位UI元素。 这样,你就可以将三维坐标转换二维坐标,并在Unity实现相应的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值