zoukankan      html  css  js  c++  java
  • Unity 4大坐标系 和 屏幕坐标与UI坐标的转换问题




    参考博客:GolDHeaven

    Unity中的4个坐标系

    世界坐标系
    平时根据transform.position等。 获取到的物体位置、旋转、缩放信息,都是根据世界坐标系获得的。


    观察坐标系
    把摄像机当做原点,基于摄像机的一个坐标系。


    屏幕坐标系
    屏幕坐标和分辨率有关,屏幕的左下角为(0,0),右上角为(screen.width,screen.height)。比如游戏的分辨率为500*600,则screen.width=500;screen.height=600。


    视口坐标系
    视口坐标系类似于屏幕坐标系,其左下角为(0,0),右上角为(1,1),我们在设计分屏游戏的时候就可以通过设置摄像机所占据的视口空间比例来控制。


    4个坐标系中常用的变换函数可以在参考博客中查看。

    世界坐标转换为UI坐标

    类似于:SLG游戏中我们点击一个世界场景中的建筑,然后在建筑的周围弹出UI显示建筑的一些信息。

    把建筑的世界坐标转换为屏幕坐标。

    //Camera.main为游戏场景中的主摄像机。
    Vector3 screenPos = Camera.main.WorldToScreenPoint(buildPos);
    

    把屏幕坐标转换为UI的坐标。
    这里介绍两种方法。(因为之前用的都是第一种方法,没见过第二种。然后公司项目用的是第二种,第一次看到那些代码的时候,搞了半天才搞懂是啥意思。。。)

    1、常用的方法,简单好用

    //canvas即为UI所在的Canvas。
    Vector2 uiPos = Vector2.zero;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform,screenPos,null,out uiPos);
    //img的锚点需要在屏幕中间,此时就可正确的设置其坐标了。
    img.rectTransform.anchoredPosition = uiPos;
    

    2、不是很常用的方法,但也可以用

    //当游戏中Canvas的渲染模式为 Screen Space - Camera时,设置渲染Camera的摄像机为UICamera。
    //用UICamera把屏幕坐标转换为UI物体的世界坐标,
    Vector3 uiWorldPos = UICamera.ScreenToWorldPoint(screenPos);
    //然后赋值给UI的3D坐标。
    img.transform.position = uiWorldPos;
    
  • 相关阅读:
    codevs 1576 最长严格上升子序列
    codevs 3415 最小和
    codevs 2102 石子归并 2
    洛谷 P1040 加分二叉树
    BZOJ 3038 上帝造题的七分钟二
    codevs 线段树练习ⅠⅡⅢ
    启动Tomcat提示:指定的服务未安装
    poj 1061 青蛙的约会 (扩展欧几里得模板)
    POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)
    HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/13597933.html
Copyright © 2011-2022 走看看