【Chatpg手把手教我学Unity的坐标系】

  • 世界坐标系
    • 绝对坐标系,Unity3D采用左手坐标系
    • transform.positon获取一个物体的世界坐标系
    • Inspector窗口的position
      • 无父对象描述的是物体的世界坐标位置
      • 有父对象描述是相对坐标
  • 屏幕坐标系
    • 以像素来定义的,左下角为原点(0,0)
    • (Screen.width, Screen.height)描述的是屏幕对应的矩形大小
    • 屏幕坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。
    • 屏幕坐标和相机之间满足:Screen.width=Camera.pixelWidth和Screen.height=Camera.pixelHeight这两个条件。按照屏幕坐标的定义,假设屏幕为800X640的大小,则此时原点转化为屏幕坐标后应该是(400,320,10)。
    • Unity中对应的转化API为:WorldToScreenPoint
    • 通过Input.mousePosition获取屏幕坐标
  • 视图坐标系
    • 视口坐标是标准化后的屏幕坐标
    • WorldToViewportPoint来将一个世界坐标转换为视口坐标。
  • GUI坐标系(UI坐标系)
    • 以像素来定义的,的范围是以左上角为(0,0),右下角为(Screen.width,Screen.height)定义的这样一个矩形,GUI坐标是一个[2D]坐标(绝对坐标)。
    • UI自适应的一个主要观点就是不要使用绝对坐标!不要使用绝对坐标!不要使用绝对坐标!
    • RectTransform的position和localPosition是等价的,都是世界坐标
    • anchoredPosition是UI元素的屏幕坐标#
Unity的世界坐标系(万物起源)

Unity的世界坐标系(World Space)是指虚拟游戏场景中所有物体共同参考的一个坐标系。在这个坐标系中,每个游戏对象都有一个唯一的位置,用三维坐标表示(x, y, z),X轴表示场景的水平方向,正方向为右;y轴表示垂直方向,正方向为上;z轴表示场景的深度方向,正方向为前。

Unity的本地坐标系(以自我为中心)
  • Unity的本地坐标系(LocalSpace)是指每个游戏对象都具有的坐标系吗,它们相对于世界坐标系而言是相对的。每个游戏对象都有自己的本地坐标系,该坐标系的原点通常为该对象的位置。
  • 世界坐标系和本地坐标系之间的关系是在Unity中,每个对象都是在世界坐标系中的一个位置,同时,它们也有一个本地坐标系
  • 本地坐标系的意义?
    • 在Unity开发中,本地坐标系最主要和最常用的是在游戏对象的变换操作中。当我们对游戏对象进行平移、旋转、缩放等操作时,这些操作都是在游戏对象的本地坐标系下进行的。简单来说,变换操作改变的是游戏对象自身的坐标系。
    • 每个游戏对象都有一个Transform组件,这个组件存储了游戏对象的位置、旋转和缩放信息,同时也实现了坐标系的变换和继承关系。通过操作Transform组件,我们可以对游戏对象进行平移、旋转和缩放等操作,从而实现游戏对象的变换和运动。当游戏对象的变换操作发生时,Unity会自动将这些变换操作转换为相应的矩阵操作,并将这些操作应用于游戏对象的本地坐标系中,然后再计算出游戏对象的世界坐标系。
    • 因为游戏对象的本地坐标系是在游戏对象的Transform组件中被实现的,所以Transform组件是在Unity中最主要、最常用的控制本地坐标系的方式之一
    • 在Unity开发中,使用Transform组件来进行坐标系的变换操作是一种简单、高效、直观、稳健和可维护的方式。
  • 注意点:使用本地坐标系时,要时刻注意坐标系的变换和继承关系。在处理物体的本地坐标系时,需要正确取得和使用它的父物体的坐标系信息,同时也要理解坐标系的变换和继承关系对于物体本身和其子物体的影响。只有完全掌握了本地坐标系的使用方法和规则,才能在Unity中更加高效地进行开发和实现复杂的游戏机制。
世界坐标系和本地坐标系如何转化?
  1. 世界坐标系转换为本地坐标系
    世界坐标系转换为本地坐标系主要是要获取物体相对于另一个物体(例如摄像机)的位置
//把一个世界坐标系下的点(transform)转换成另一个物体的本地坐标系下(otherObject)的点
Vector3 pointInLocalSpace = transform.InverseTransformPoint(otherObject.transform.position);
  1. 本地坐标系转换为世界坐标系
//世界坐标,结果受transform坐标的影响
Vector3 = pointInWorldSpace = trasform.TransformPoint(otherObject.transform.position);

这个值并不是真正的世界坐标,而是otherObject相对于世界坐标系的位置减去 transform 组件相对于世界坐标系的位置得到的。

屏幕坐标是什么?
  • 屏幕坐标(Screen Space)也称为屏幕空间,是指以屏幕为参照的二维坐标系,坐标原点在屏幕左下角。在Unity中,用屏幕坐标来描述GUI元素的位置和大小,还被用于用户界面和后处理效果。
  • 屏幕坐标的范围通常是从(0,0)到(Screen.width, Screen.height),大小以像素为单位。在屏幕坐标系中,X轴方向从左向右,Y轴方向从下向上。因为屏幕坐标系是二维坐标系,未包含深度信息。如果需要把三维场景中的物体投影到二维屏幕上,就需要使用Unity的摄像机组件进行视角投影,将场景中的物体转换为屏幕坐标系下的2D图像。
  • 在程序中,可以用Camera.WorldToScreenPoint将3D空间中的点转换为屏幕坐标系中对应的点,也可以用Camera.ScreenToWorldPoint将屏幕坐标系中的点转换为3D空间中对应的点。
  • 在Unity中,屏幕坐标系与屏幕的分辨率有关。屏幕坐标系的大小和位置是根据当前屏幕的分辨率动态计算得出的。因此,如果你的游戏在不同的设备上运行,屏幕坐标系的大小和位置也会随之改变。
屏幕坐标系和世界坐标系有关系吗?
  • 世界坐标系和屏幕坐标系之间的关系是将一些在3D空间中定义的物体转换为2D平面上的投影。这个投影是通过摄像机的透视或正交投影来实现的。
  • 世界坐标系是定义为三维空间中的物体相对于场景中的坐标系的位置和方向,而屏幕坐标系是定义为屏幕上显示的二维画面的位置和大小的坐标系。
  • 在Unity中,摄像机把3D物体投影到2D屏幕上。当一个3D物体被渲染时,其坐标被从世界坐标系转换到屏幕坐标系。具体方法是将物体的坐标从世界空间转换到摄像机的视图矩阵中,然后将结果转换到NDC坐标中(归一化设备坐标),最后将NDC坐标转换为屏幕坐标。这些转换都是自动由Unity处理的。
  • 因此,世界坐标系和屏幕坐标系之间的关系是通过Unity摄像机来确定的。这个关系是必要的,因为在游戏中设计交互元素(GUI)和要在屏幕上显示的信息时,需要用屏幕坐标系。
Unity屏幕坐标系和世界坐标系相互转换
  1. 屏幕坐标系转世界坐标系:可以使用Camera.ScreenToWorldPoint来将屏幕坐标系下的点转换为世界坐标系下的点。这个方法需要一个参数,表示在哪个摄像机的视角下进行转换
  2. 世界坐标系转屏幕坐标系:可以使用Camera.WorldToScreenPoint来将世界坐标系下的点转换为屏幕坐标系下的点。这个方法同样需要一个参数,表示在哪个摄像机的视角下进行转换
什么是UGUI坐标系?
  • UGUI坐标系是指Unity中的用户图形界面(User Interface,简称UI)中的坐标系,是与屏幕坐标系不同的一种坐标系。UGUI坐标系也称为画布坐标系,是作为UI元素的基础布局系统而存在的。
  • UGUI坐标系原点位于画布的中心点,X轴向右,Y轴向上,Z轴垂直向屏幕外。UGUI中的坐标值以单位为像素,是相对于画布大小而言的。
  • 因为UGUI坐标系与屏幕坐标系不同,所以在操作时需要进行坐标系的转换,以便正确地渲染UI元素。例如,在UGUI坐标系中将一个UI元素移动到屏幕坐标系的坐标时,需要使用RectTransformUtility.ScreenPointToWorldPointInRectangle 方法将屏幕坐标转换为世界坐标系下的点,然后将这个点用于更新UI元素的位置。
UGUI坐标和屏幕坐标系有什么关系?
  • UGUI坐标系(Canvas Space)和屏幕坐标系(Screen Space)之间有非常密切的关系,它们之间的转换是界面显示和交互的基础。在Unity中,UGUI坐标系是2D UI元素的基础布局系统,而屏幕坐标系用于描述游戏画面和GUI元素的屏幕位置和大小。
  • 屏幕坐标系是指以屏幕为参照的二维坐标系,坐标原点在屏幕左下角,通常使用的单位是像素。在Unity中,屏幕坐标系用于描述摄像机视口内的2D GUI元素的位置和大小,以及用户界面和后处理效果,包括ugui元素。
  • 而UGUI坐标系是指Unity中的用户图形界面(User Interface,简称UI)中的坐标系,坐标原点位于画布的中心点。在UGUI坐标系中,X轴向右,Y轴向上,Z轴垂直向屏幕外。UGUI坐标系是作为UI元素的基础布局系统而存在的。
  • 在Unity中,UGUI坐标系是相对于画布的大小而言的,而屏幕坐标系是相对于屏幕的分辨率而言。当我们用RectTransformUtility.ScreenPointToWorldPointInRectangle方法将一个屏幕坐标转换为世界坐标系下的点时,实际上就是将屏幕坐标与画布的大小进行比例转换。转换后的点在世界坐标系中表示该UI元素的实际位置。
  • 在开发中,需要用到屏幕坐标系来获取鼠标或触摸的位置,之后再将这个位置转换成UGUI坐标系下的位置,这样就可以准确地响应用户输入事件。在渲染UI元素时,也需要将UGUI坐标系下的位置转换成屏幕坐标系下的位置,以便正确地在屏幕上渲染元素。
//将屏幕坐标系下的点转换为相对于UI元素的本地坐标系下的点
//uiElement是目标UI元素的RectTransform
//screenPos是屏幕坐标系下的点
//Camera.main是用来解决屏幕坐标系和世界坐标系之间的映射的摄像机
//localPos是转换后的本地坐标系下的点
RectTransformUtility.ScreenPointToLocalPointInRectangle(uiElement.rectTransform, screenPos, Camera.main, out Vector2 localPos);


//将世界坐标系下的点转换为屏幕坐标系下的点
Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.main, worldPos);

//用于获取画布的缩放比例。
float scale = canvasScaler.scaleFactor;


//RectTransform.rect.size属性:用于获取UI元素在UGUI坐标系下的大小。
Vector2 size = uiElement.rect.size;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值