Unity世界坐标局部坐标转换

world pos -> ui local pos

世界坐标转UI局部坐标比较常用,也比较简单。

Vector3 worldPosition = _3dTransform.position;
Vector3 screenPosition = _3dCamera.WorldToScreenPoint(worldPosition);

Vector2 localPostion;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)_canvas.transform, screenPosition, _canvas.worldCamera, out localPostion))
{
    _2dTransform.localPosition = localPostion;
}

ui local pos -> world pos

  1. 如果知道UI物件,直接通过transform.position获得。

  2. 如果只知道UI父节点以及一个相对于父节点的局部坐标,可以通过:

    worldPos = parentTransform.TransformPoint(localPos);
    
  3. 如果只知道一个UI坐标,需要先转到屏幕坐标系,再转到世界坐标系:

    首先主要考虑的是UI适配,通常canvas scale会设置成Scale With Screen Size,Canvas大小就不一定是屏幕分辨率的大小。

    假设原本的标准分辨率是720x1280,在ipad的分辨率1536x2048上显示时:

    假如是以高度为适配,那么Canvas 实际高度为1280,宽度为1536 / 2048 * 1280 = 960,拉伸比例为2048 / 1280 = 1.6;

    假如是以宽度为适配,那么Canvas实际宽度为720,高度为2048 / 1536 * 720 = 960,拉伸比例为1536 / 720 = 2.13;

    那么屏幕坐标 = Canvas下的UI局部坐标 * 拉伸比例 + 屏幕宽高 / 2;

    因为Canvas UI局部坐标系的原点在中间,而屏幕坐标系的原点在左下角。

    接着再通过ScreenToWorldPoint(screenPos)转为世界坐标。

    代码如下:

var standardSize = new Vector2(720f, 1280f);
var scale = canvasScaler.matchWidthOrHeight == 0
    ? Screen.width / standardSize.x
    : Screen.height / standardSize.y;
var screenPos = localPos * scale + 0.5f * new Vector2(Screen.width, Screen.height);
var worldPos = new Vector3();
 RectTransformUtility.ScreenPointToWorldPointInRectangle((RectTransform) canvas.transform, screenPos, uiCamera, out worldPos);
  1. 如果只是为了获得偏移,可以简单地通过比例来获得:
    worldOffsetY / uicamera.orthographicSize * 2 = uiOffsetY / Screen.height
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,每个游戏对象都有一个Transform组件,它可以控制游戏对象的位置、旋转和缩放。Transform组件有两个属性:position和rotation,它们分别代表了游戏对象在世界坐标局部坐标系中的位置和旋转。 世界坐标局部坐标系之间的关系十分重要,因为它们决定了游戏对象的位置和旋转。下面分别介绍一下它们之间的关系: 1. 世界坐标局部坐标的转换关系 在Unity中,一个游戏对象的世界坐标可以通过它的Transform组件的position属性来获取,而它的局部坐标可以通过Transform组件的localPosition属性来获取。要将一个游戏对象的局部坐标转换世界坐标,可以使用Transform的TransformPoint方法,例如: ``` Vector3 worldPos = transform.TransformPoint(localPos); ``` 这个方法将把localPos从游戏对象的局部坐标系转换成世界坐标系,并返回转换后的坐标。 相反,要将一个世界坐标转换成局部坐标,可以使用Transform的InverseTransformPoint方法,例如: ``` Vector3 localPos = transform.InverseTransformPoint(worldPos); ``` 这个方法将把worldPos从世界坐标系转换成游戏对象的局部坐标系,并返回转换后的坐标。 2. 世界坐标局部坐标的关系 在Unity中,一个游戏对象的世界坐标是相对于游戏世界的原点而言的,而它的局部坐标是相对于游戏对象自身的坐标系而言的。因此,一个游戏对象的世界坐标局部坐标之间的关系可以用下面的公式表示: ``` worldPos = parentWorldPos + localPos ``` 其中,worldPos代表游戏对象的世界坐标,parentWorldPos代表游戏对象的父对象的世界坐标(如果有的话),localPos代表游戏对象在父对象的局部坐标系中的坐标。 这个公式说明了,一个游戏对象的世界坐标是由它在父对象的局部坐标系中的坐标和父对象的世界坐标共同决定的。因此,如果一个游戏对象的父对象的世界坐标发生改变,那么它自身的世界坐标也会发生相应的改变。 总之,世界坐标局部坐标在Unity中是非常重要的概念,它们决定了游戏对象的位置和旋转。在开发过程中,我们要经常使用Transform组件的position、localPosition、TransformPoint和InverseTransformPoint方法来处理世界坐标局部坐标之间的转换关系。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值