Unity四种坐标系

本文详细解析了Unity中四种主要坐标系的特点与应用:世界坐标、屏幕坐标、视口坐标及GUI坐标。阐述了它们之间的区别与联系,并介绍了如何进行坐标转换。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

一 World Space(世界坐标):

我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。


1. 代码获取的transform.position都是一致的

无论是3d还是2d,ugui/ngui,父子关系,transform.position都是以场景中心(0,0)的位置开始计算,单位长度也都是一样的。

x轴:左负右正

y轴:上正下负

z轴:里正外负

无论怎样的UI,怎样的层级关系,代码里输出Debug.log(go.transform.position),输出的总是相对于场景中心(0,0)的距离,也是获取世界坐标的方法。


2. 检视面板的position数值和代码获取的position数值不一致

ngui和ugui的Transform和Recttransform的position显示的数值和代码里获取的transform.position不一致。

ugui btn代码位置position=new Vector(1,0,0),面板显示(31.3,0,0)

ngui btn代码位置position=new Vector(1,0,0),面板显示(371,0,0)

具体比例不是很清楚,可能和测试环境有关。


3. 父子关系的容器,检视面板position和代码获取position不一致

cube和ngui/ugui的子对象的Transform/Recttansform在检视面板中显示的Position数值是相对于父容器的,

但是代码里获取的Transform/RectTransfrom的position是相对于场景中心的。

获取世界坐标:go.transform.position

获取本地坐标:go.tranfrom.localPosition   (cube/ngui/ugui,无论层级关系,都是获取的是检视面板中的坐标)

可推断ugui/ngui都是在场景中的一个容器之中,所以检视面板显示的都是相对于父容器的坐标,而不是世界坐标。


二 Screen Space(屏幕坐标):

以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。


鼠标位置Input.mousePosition获取的是屏幕坐标。

例如场景分辨率1024x768,如果屏幕被缩小至100x100,那么点击右上角是100x100,而不是分辨率的1024x768。


三 ViewPort Space(视口坐标)

视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。


四 绘制GUI界面的坐标系:

这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。


坐标转换:

世界坐标 -> 本地坐标:貌似不用转,直接可以position和localPosition获取。

本地坐标 -> 世界坐标:

世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

视口坐标→屏幕坐标:camera.ViewportToScreenPoint();

 视口坐标→世界坐标:camera.ViewportToWorldPoint();


父子对象关系:

SetParent(Transform parent, bool worldPositionStays);

false:不保留世界坐标。改变层级关系后,坐标数值不变,位置变化,会相对于父对象移动。

true(默认):世界坐标不变。改变层级关系后,不会移动。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Unity 中使用的坐标系类型及其特点 #### 世界坐标系 (World Space) 世界坐标系是一个全局的三维坐标系统,在此坐标系中,所有的物体都相对于一个固定的世界原点来定义位置。这个坐标系是左手坐标系,意味着Z轴正方向指向屏幕内部。在Unity场景中,可以通过 `Transform.position` 获取对象的世界坐标。 ```csharp Vector3 worldPosition = transform.position; ``` [^2] #### 局部坐标系 (Local Space 或 Parent Space) 局部坐标系是以父级 GameObject 的变换为基础而构建的一个子坐标系。如果某个 GameObject 没有父节点,则它的局部坐标与其世界坐标一致;如果有父节点的话,那么它就是基于父节点的位置、旋转和缩放来进行定位。可以使用 `Transform.localPosition` 来获取或设置对象在其父级下的相对位置。 ```csharp Vector3 localPosition = transform.localPosition; ``` #### 视图坐标系 (View Space 或 Camera Space) 当涉及到摄像机视角时就会用到视图坐标系,也称为相机空间。在这个坐标系里,所有的东西都是按照当前活动摄像头的角度来看待的。通常用于光照计算和其他渲染操作前的空间转换。可以从世界坐标转成视口坐标使用 `Camera.WorldToViewportPoint()` 方法。 ```csharp Vector3 viewportPosition = mainCamera.WorldToViewportPoint(worldPosition); ``` #### 裁剪坐标系 (Clip Space) 这是图形管线中的一个重要阶段所处的空间形式之一,位于顶点着色器之后片段着色器之前。裁剪坐标是在[-w,w]范围内标准化后的齐次坐标,其中 w 是第四个分量。经过透视除法后得到的是归一化设备坐标(NDC),范围为 [-1,1]. #### 屏幕坐标系 (Screen Space) 屏幕坐标系用来表示像素级别的二维平面位置,左下角通常是(0,0),右上角则是分辨率宽度高度对应的数值。对于处理UI元素或者检测鼠标点击事件非常有用。可通过 `Input.mousePosition` 访问鼠标的当前位置。 ```csharp Vector3 mousePos = Input.mousePosition; ``` [^4] #### 模型坐标系 (Model Space) 模型坐标系是指每个独立的对象自身的本地坐标体系,也就是网格数据最初创建时所在的坐标环境。这有助于保持原始几何形状不变的同时允许整体移动而不影响其他部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值