Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >理解Unity3D中的四种坐标体系

理解Unity3D中的四种坐标体系

作者头像
IT自学不成才
发布于 2019-01-08 03:03:34
发布于 2019-01-08 03:03:34
6.3K0
举报

理解Unity3D中的四种坐标体系

2017-07-31 by Liuqingwen | Tags: Unity3D | Hits

一、前言

刚开始接触 Unity3D 的时候,经常会被 Unity 中各种坐标系搞得昏头转向不知所措,毕竟是一个 3D 兼 2D 游戏开发殷勤,还要把 3D 作品最终发布到 2D 的桌面或者手机系统中,所以熟悉掌握 Unity3D 中的坐标系是非产重要的。

其实如果仅仅只有 3D 坐标系还是很简单的,就目前来说我们所见过的三维建模软件或者游戏开发软件所用的坐标系分两种:左手坐标系和右手坐标系。怎么区别呢?大家看下图就知道了:

区分坐标系可以按上图方法,这里我也有个简单的判断方法:用手握住 z 轴,大拇指朝向 z 轴正方向,然后用手的四指从 x 轴正方向握拳头,如果是左手 90 度就能把四指握到 y 轴就是左手坐标系,如果是右手 90 度握紧后到了 y 轴就是右手坐标系。

除了 3D 世界中的坐标系,还有其他的几个坐标系也非常常用,比如我们经常要把世界三维坐标系转换成我们最终屏幕中的二维坐标系,或者把手机屏幕的二维坐标系转化成游戏世界中的三维坐标系等,各个坐标系各有特别,不能混用,为了更好的学习 Unity 游戏开发,自己在此总结一下 Unity 当中的坐标系和相关用法,以作备忘和学习。

二、坐标体系

Unity3D 当中基本的坐标体系主要有下面这四种:

  1. 世界坐标系 (World Space)
  2. 屏幕坐标系 (Screen Space)
  3. 视口坐标系 (Viewport Space)
  4. GUI界面坐标系 (GUI System)

这四种坐标系可以说没有一个是完全相同的,各个坐标系所代表的意思也可以从字面含义中理解出来,它们之间都是可以相互转换的,不过 GUI 坐标体系除外,它比较特殊,也相对来说是最简单的,那么我们就从最简单的说起吧。

1. 绘制 GUI 界面的坐标体系

我们在做 Unity 游戏开发的时候,经常会使用内置的 GUI 来做一些测试,比如显示一个按钮控制游戏,画一个文本显示相关信息等。它的代码全部控制在 OnGUI() 函数中:

代码语言:javascript
AI代码解释
复制
private void OnGUI()
{
    if (GUI.Button(new Rect(0f, 0f, 160f, 40f), "Click Me"))
    {
        //button clicked and do something here...
    }
}

这个按钮 Button 所在的坐标系就是 GUI 绘制坐标系。大家稍微测试一下就知道了,它的原点 (0, 0) 在最左上角,因为屏幕宽度是 Screen.width ,高度是 Screen.height ,所以 GUI 体系右下角的坐标为: (Screen.width, Screen.height) , 这是一个二维的坐标体系,坐标 z 的值都为 0 。大家可以看下图加深理解:

2. 视口 Viewport 坐标体系

当我们使用多个相机,在同一个场景中显示多个视口的时候,我们就需要用上视口坐标系了。

视口坐标系对于场景的显示非常重要,对于新手来说我们经常使用一个相机就够了,但是当需要使用到多个视口的时候,我们就必须关注视口坐标体系了,大家可以在相机 Camera 的属性中看到 Viewport Rect 就是视口坐标系的设置:

一个相机对应一个视口,视口预览( Camera Preview )展示了相机所看到的所有物体,很显然,它默认大小是 (width = 1, height = 1) ,位置也是从 0 到 1 ,这个位置就是我们所讨论的坐标系:左下角为 (0, 0) ,右上角是 (1, 1) ,一般视口坐标系主要用在相机显示中,我们简单的进行 Viewport Rect 的设置就可以了。

另外,新手朋友们可以记住这么一个快捷键: Ctrl + Shift + F ,可以快速设置相机视口到当前场景窗口的视口位置。下图是视口坐标系和鼠标在屏幕上的坐标系的转换结果:

3. 屏幕 Screen 坐标体系

嗯,非常重要!不管怎样,最终我们所有的成果都会发布到各个平台(屏幕)上,所以,任何坐标系的坐标和屏幕坐标系的转换都是非常重要的。比如我们经常需要处理鼠标的相关事件(鼠标位置、单击、双击事件等),或者手机上的触摸反馈,这些原始数据都是屏幕坐标系相关的。

虽然重要,其实屏幕坐标系处理起来很简单直接, Input.mousePosition 获取的就是鼠标在屏幕中的位置坐标。大家可以测试一下,屏幕坐标系中原点 (0, 0) 位于左下角,那么右上角必然就是 (Screen.width, Screen.height) ,对了,还有一个 z 呢?都为 0 吗?答案是肯定的,既然是二维坐标系那么 z 肯定是 0 了,和 GUI 坐标系一样,但是话又说回来,屏幕坐标系转换成世界坐标系 z 还是 0 吗?其实不然,屏幕坐标转换成世界坐标后物体的 z 值是取决于相机的,因此: gameObject.z = camera.z ,其实在上面视口坐标系介绍中的图中我已经把 Mouse Point 鼠标位置转换成世界坐标( World Point )了,大家应该注意到了吧。

那么,除了坐标系的转换,还有什么值得注意的呢?这里我要告诉大家的是,我们在控制相机的时候,因为屏幕显示的就是相机所看到的内容,而屏幕的宽高比直接影响了相机的显示,也就是 Aspect Ratio 的值,大家可以在 Game 面板中轻松地设置 Aspect 宽高比,查看对游戏画面的影响:

如下图,相机的宽高比和屏幕宽高比一致,显示结果也一致:

如果相机的宽高比设置的和屏幕宽高比不一样的话,显示结果就有点不同了:

所以,在游戏开发中,我们要重视相机的宽高比 Camera.aspect 的值,一般我们会保持相机宽高比不变,然后通过改变相机的视口尺寸 Camera.orthographicSize 来显示场景中需要显示的物体,关于这个主题我会在我的下一篇文章中提到,大家可以关注我的博客。如何通过宽高比获取摄像机视口尺寸呢?首先可以从上图中知道宽高比的计算方法: aspect = width / height ,当你同时获取到 widthheight 的时候,你通过 Mathf.Max(height, width / aspect) 来得出最终的尺寸大小(注意这个结果是 2 倍视口尺寸哦)。这个在游戏场景中应用的还是比较多的,比如你有这么个需求:两个玩家移动对战,你的相机要把两个移动的玩家随时放置在屏幕显示中。

4. 世界 World 三维坐标系

最后,世界坐标系!世界坐标系不是最简单的,但却是我们最常用的坐标系。记住一点,任何情况下: transform.position 都是返回物体的世界坐标值,及时你所使用的是子物体!另外,从上面所讲的屏幕坐标系转换成世界坐标系也是非常简单的,它以当前相机为参考:

代码语言:javascript
AI代码解释
复制
var position = Input.mousePosition;
var worldPoint = Camera.main.ScreenToWorldPoint(position);

另一方面,我们在游戏开发过程中,经常要处理子物体的相对 transform 值,这个时候我们就需要稍微动点脑子了,当然如何转变 Unity 已经帮我们预制好相应的函数方法了,你只要把父物体当做世界,子物体当做世界中的物体,使用这些函数,换一下坐标就和处理绝对坐标一样了,不知道大家理解没有。我举个例子,我们在游戏开发中会遇到这种情况,你的相机如果直接放到世界中那么必然会需要调整它的旋转角度才能达到满意的视口位置,如何不让相机产生任何旋转就能把世界中的游戏物体放到合适的视口位置呢?

办法就是:我们把相机放到一个产生了合适旋转角度的父物体当中!这样做的效果就是:相机就相当于子物体,父物体旋转了,子物体就不需要额外旋转了,这时候相机的局部旋转就为 0 。这在有些场景中使用起来很方便,相机已经是父物体世界中的子物体了。

怎么计算相对坐标呢?在 Unity 中都有相应的函数,使用比较简单:

代码语言:javascript
AI代码解释
复制
//获取的是世界坐标
var childPosition = childObject.transform.position;
//转化为父物体下的相对坐标,相当于位于父物体世界中
var relativePosition = parentObject.transform.InverseTransformPoint(childPosition);
//转化为世界坐标,注意:这里不能传入 childPosition ,因为 childPosition 就是世界坐标
var worldPosition = parentObject.transform.InverseTransformPoint(relativePosition);

//所以,下面结果是相等的!
print(childPosition == worldPosition);

三、总结

当然,在使用坐标系过程中我们还要关注其他方方面面,比如欧拉角的旋转,万向锁,平滑过渡视野等等,这些我想我会在后面的文章总结中写道吧。这次就总结介绍了这几个坐标系,看上去有点复杂,总体来说还是挺很好理解的,有什么不对的或者可以加强的请给我留言,谢谢!

最后附上刚开始的总结一图:

资料: Unity3d数学基础之坐标系: http://www.jianshu.com/p/86decf1697b0 Unity空间坐标相关知识: http://www.jianshu.com/p/9ed5f8d023ff

Unity3D


Comments:

Please enable JavaScript to view the comments powered by Disqus.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​OpenGL 学习系列---坐标系统
在前面绘制基本图形中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:
音视频开发进阶
2019/07/25
1.6K0
ThreeJS实现屏幕坐标转3d坐标 - plus studio
在虚拟世界中,3D坐标与屏幕坐标之间的转换是一个重要的问题。使用ThreeJS开发3D场景时,经常需要将屏幕坐标转换为3D坐标。在本文中,我们将介绍如何使用ThreeJS实现屏幕坐标转3D坐标的两种方法
plus sign
2024/02/28
8560
Unity2D游戏开发-坐标系与辅助线绘制
总之,Unity中的本地坐标系是相对游戏对象自身的坐标系统,用于表示对象内部的相对关系,是一个非常重要的概念
码客说
2023/08/08
1.3K0
Unity2D游戏开发-坐标系与辅助线绘制
[学习笔记]unity3d-坐标系统
Unity坐标系 World Space 世界(全局)坐标系:整个场景的固定坐标。 作用:在游戏场景中表示每个游戏对象的位置和方向。Local Space 物体(局部)坐标系:每个物体独立的坐标系,原点为模型轴心点,随着物体移动或旋转而改变。 作用:表示物体间相对位置与方向。Screen Space 屏幕坐标系:以像素为单位,屏幕左下角为原(0,0)点,右上角为屏幕宽高(Screen.width,Screen.height),Z为到相机的距离。 作用:表示物体在屏幕中的位置。Viewport Spa
六月丶
2022/12/26
7000
Unity3D-关于项目的屏幕适配(看我就够了)
屏幕适配是为了让我们的项目能够跑在各种电子设备上(手机,平板,电脑) 那么了解是适配之前首先要了解两个知识点:
孙寅
2020/06/02
31.2K0
Unity基础(20)-Camera类
照相机是玩家观察世界的装置,屏幕空间点按像素定义,屏幕的左下为(0,0);右上是(pixelwidth,pixelHeight),z位置在照相机的世界单位中。
孙寅
2020/06/02
3K0
[OpenGL]OpenGL坐标系及坐标转换
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ouyangshima/article/details/25135009
用户1148525
2019/06/11
4.9K0
unity3d之核心类介绍
Unity3D的最基本的核心类型。包括Object、GameObject、Component、Transform、Behaviour、Renderer、Collider、Rigidbody、Camera、Light、MonoBehaviour等。
李小白是一只喵
2020/11/12
1.3K0
Unity基础(10)-坐标系统
3D坐标系是3D游戏开发与VR开发中的基础概念。一般而言3D坐标系都是使用的 笛卡尔坐标系来描述物体的坐标信息,笛卡尔坐标系:分为左手坐标系与右手坐标系
孙寅
2020/06/02
5.4K0
【学习笔记】Unity3D官方游戏教程:Tanks Tutorial
2017-08-03 by Liuqingwen | Tags: Unity3D | Hits
IT自学不成才
2019/01/08
1.5K0
[Unity3D] Unity3D游戏开发之UGUI实现伤害数值显示
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/03
1.2K0
理解单目相机3D几何特性
激光雷达技术、以及立体视觉通常用于3D定位和场景理解研究中,那么单个摄像头是否也可以用于3D定位和场景理解中吗?所以我们首先必须了解相机如何将3D场景转换为2D图像的基本知识,当我们认为相机坐标系中的物体场景是相机原点位置(0,0,0)以及在相机的坐标系的X、Y、Z轴时,摄像机将3D物体场景转换成由下面的图描述的方式的2D图像。
点云PCL博主
2022/04/06
2.2K0
理解单目相机3D几何特性
终端图像处理系列 - OpenGL ES 2.0 - 3D基础(矩阵投影)
Overview 移动设备的屏幕是二维平面,要想把一个三维场景渲染在手机二维屏幕上,需要利用OpenGL中的矩阵投射,将三维空间中的点映射到二维平面上。三维矩阵的相关知识是学习OpenGL最重要的课程之一。 线性代数 学习OpenGL三维投射知识之前,我们得事先了解下一些基础的线性代数知识,如向量运算,矩阵运算。 向量运算 向量: 指一个同时具有大小和方向的几何对象,因常常以箭头符号表示以区别于其它量而得名。 向量加减 向量的加(减)法定义是分量的相加(减),即将一个向量中的每一个分量加上(减去)另一个向量
天天P图攻城狮
2018/02/02
2.9K0
终端图像处理系列 - OpenGL ES 2.0 - 3D基础(矩阵投影)
初识 Unity3D
早些年,游戏引擎市场的变化是非常大的,其中有一些比较出色的软件。比如 unreal,但是 unreal 走的商业模式针对的是大型的游戏公司,大公司通过购买序列号,价格是非常昂贵的。一些小公司就会采取低价策略,但是对于一些个人就用不起这种高贵的引擎,只能使用的引擎,比如 ogre,有的技术大牛,可能也会自己 DIY 一款自己游戏引擎。
hrscy
2018/08/30
2K0
初识 Unity3D
OpenGL ES-3D图形变换知识
最近一段时间很忙,没什么时间再去研究OpenGL,有朋友问我OpenGL ES图形变换的相关问题,这里抽出时间整理一下相关资料,便于大家学习3D图形运动的知识。 (ps:有朋友以为我去腾讯云+社区写博客去了,这里说明一下,没有换平台写博客,只是加入了腾讯的云+社区分享计划,这里写的文章会自动同步到腾讯云+社区,有腾讯云+社区的朋友也可关注我) 一.坐标系统 OpenGL希望在所有顶点着色器运行后,所有我们可见的顶点都变为标准化设备坐标(Normalized Device Coordinate, NDC)。
清墨
2018/07/04
1.1K0
在Unity3D中如何画线,LineRender组件你一定要会(Unity3D)
  大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧。
恬静的小魔龙
2022/08/07
6K0
在Unity3D中如何画线,LineRender组件你一定要会(Unity3D)
Unity3D游戏开发初探—2.初步了解3D模型基础
  简而言之,3D模型就是三维的、立体的模型,D是英文Dimensions的缩写。
Edison Zhou
2018/08/20
2.3K0
Unity3D游戏开发初探—2.初步了解3D模型基础
【Unity3D】世界坐标系 ( 左手坐标系 | 游戏物体坐标 | 世界坐标系方向 )
Unity 的世界坐标系 采用的是下图中的 左手坐标系 , 当 x 轴向右 , y 轴向上 时 , z 轴向里 ;
韩曙亮
2023/03/30
3.8K0
【Unity3D】世界坐标系 ( 左手坐标系 | 游戏物体坐标 | 世界坐标系方向 )
Unity3D之Transform
Unity3D的Transform是用于描述游戏对象在场景中的位置、旋转和缩放的组件。它是Unity中最常用的组件之一,可以实现对象的移动、旋转和缩放等操作。
叶茂林
2023/07/30
6330
鼠标控制物体旋转、移动、缩放(Unity3D)
一、前言 Unity3D对于鼠标操作物体的旋转、移动、缩放的功能点使用的比较多。 今天就分享如何使用Unity实现鼠标对于物体的旋转、移动、缩放。 效果图: 二、知识点 Input.GetMouseButton(0) 获取鼠标输入,参数为一个int值 为0的时候获取的是左键 Input.GetMouseButton(1) 为1的时候获取的是右键 Input.GetMouseButton(2) 为2的时候获取的是中键(就是那个滑轮) Input.GetMouseButton 鼠标按压 I
恬静的小魔龙
2022/08/07
5.4K1
鼠标控制物体旋转、移动、缩放(Unity3D)
相关推荐
​OpenGL 学习系列---坐标系统
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场