Unity(三)三维数学和坐标系统


因为Unity 3D中有关Vector3的三维数学内容相对难以理解且重要,所以想再理解体会一下。

向量

Vector3:一种数据类型,表示3D的向量和点。包含位置、方向、欧拉角的信息,也包含做些普通向量运算的函数。

要获取世界坐标原点到位置坐标的向量可以使用物体的Position属性

Vector V=transform.position

position.magnitude方法可以获得此向量的模,position.normalized 方法可以获得与此向量同向的单位向量。

Direction=A.position-B.position可以获取两个物体的向量差,向量指向被减数。

值得一提的是,移动方法Translate()的参数就可以给予一个向量,对应物体就会沿着该向量方向移动大小等同于该向量模大小的距离、

坐标系统

Unity中主要有四种坐标系:

1.全局坐标系: 即世界坐标系,整个场景的固定坐标,在游戏场景中表示每个物体的固定位置和方向;

**2.局部坐标系:**即物体坐标系,每个物体独立的坐标系,原点为模型轴心点,随着物体的旋转或者移动而改变,表现物体间的相对位置和方向;

**3.屏幕坐标系:**把屏幕看作一个坐标系,屏幕左下角是(0,0),右上角为屏幕的最大宽高。Z轴的坐标是相机的世界坐标中Z轴坐标的负值;

**4.视口坐标系:**视口坐标系跟屏幕坐标系相似,只不过将Game视图的屏幕坐标系单位化,左下角依旧是(0,0)。右上角变为(1,1),比较适合用比例来计算。

各个坐标系也有相对应的转换方法:

从局部坐标系到全局坐标系可以用transform.TransformPoint()方法

例:Vector WorldPoint=transform.TransformPoint(Vector3 E)

参数E为物体自身局部坐标系的对应位置,该方法将会返回物体自身坐标系对应E位置的点在全局坐标系中的位置

从全局坐标系到局部坐标系可以用transform.InverseTransformPoint()方法

从屏幕坐标系到全局坐标系可以用Camera.main.ScreenToWorldPoint()方法

从全局坐标系到屏幕坐标系可以用Camera.main.WorldToScreenPoint()方法

从视口坐标系到全局坐标系可以用Camera.main.ViewportToWorldPoint()方法

从全局坐标系到视口坐标系可以用Camera.main.WorldToViewportPoint()方法

欧拉角

欧拉角的思想是将物体绕某一轴的一次旋转,分解为依次分别绕X、Y、Z轴的三次旋转。这三个轴分别旋转的转动角度,就是一组三个欧拉角,X与Z轴以自身坐标系为准旋转,Y轴则以全局坐标系旋转。

欧拉角的数据类型也是Vector3数据类型,但是它没有方向没有大小的概念,他的x-y-z表示的是各个轴向上的旋转角度。而position有方向,有大小,他的x-y-z表示的是各个轴向 上的有向位移。

万向节死锁

欧拉角的一大缺点便是会产生万向节死锁问题,它是由欧拉旋转定义本身造成的。

如图,当欧拉角先绕X轴旋转±90度的时候,这时物体自身的Z轴和全局坐标系的Y轴重合了,若物体此时再沿着Z轴或Y轴旋转,会发现失去了一个旋转自由度,这就是万向节死锁问题。

欧拉角只用三个数字表达方位,且符合人的思考方式,但是它会产生万向节死锁问题,

这时候我们就需要引入四元数的相关概念。

四元数

四元数不会产生万向节死锁并且能够很容易被插值,它用于表示旋转,Unity使用Quaternion表示所有旋转,它由一个三维向量(X-Y-Z)和一个标量W组成,旋转轴为Vector3,旋转弧度为θ,其中

x=sin(θ/2)*Vector3.x

y=sin(θ/2)*Vector3.y

z=sin(θ/2)*Vector3.z

w=cos(θ/2)

它们的取值范围都为-1~1

tranform组件的变量rotation,它的类型就是四元数

Quaternion qt=transform.rotation

相关API

Vector3

一些静态变量:

back 即Vector3(0, 0, -1);
down 即Vector3(0, -1, 0);
forward 即Vector3(0, 0, 1);
left 即Vector3(-1, 0, 0);
one 即Vector3(1, 1, 1);
right 即Vector3(1, 0, 0);
up 即Vector3(0, 1, 0);
zero 即Vector3(0, 0, 0);
magniude 返回向量的长度
SqrMagnitude 返回向量的长度平方

1.float angle = Angle(Vector a, Vector b):返回a向量和b向量之间的夹角

2.Vector3 b = Vector3.ClampMagnitude(a, float length):返回一个和a向量同方向的b向量,模长为length

3.Vector3 c = Vector3.Cross(Vector a, Vector b):返回a与b的叉乘

4.float distance = Vector3.Distance(Vector a, Vector b:返回a与b坐标之间的直线距离

5.float c = Vector3.Dot(Vector a, Vector b):返回a与b之间的点乘结果

6.Vector3 c = Vector3.Lerp(Vector a, Vector b, float t):返回两个点之间的线性插值

7.Vector3 force = Vector3.Project(Vector3 a, Vector3 b):返回值为a在b上的投影向量

8.Vector3 force = Vector3.ProjectOnPlane(Vector3 a, Vector b):返回值为a在b对应过世界原点平面的投影

9.Vector3 result = Vector3.Reflect(Vector3 a, Vector3 b):返回值为a以b为法线反射出去的反射光线向量

Quaternion

1.Quaternion.Euler(Vector3 angle):以欧拉角构建四元数,使该四元数变化以该欧拉角旋转,该旋转以世界坐标为准旋转,返回该旋转

transform.rotation方法等价于Quaternion.Euler(Vector3 Angle)方法

2.Quaternion.AngleAxis(float angle, Vector3 axis):该四元数变化绕着axis轴向旋转angle角度,返回该旋转

3.Quaternion.Angle(Quaternion a, Quaternion b):获得a和b两个四元数之间的角度

4.Quaternion.FromToRotation(Vector3 a, Vector3 b):返回从a旋转到b的相对旋转量
Quaternion.Angle(Quaternion a, Quaternion b):获得a和b两个四元数之间的角度

4.Quaternion.FromToRotation(Vector3 a, Vector3 b):返回从a旋转到b的相对旋转量

Unity(三)三维数学和坐标系统相关推荐

  1. 小学三年级上册计算机计划,小学三年级数学上册教学计划

    小学三年级数学上册教学计划 一.班级情况分析 这一学期我继续担任三年级数学教学工作,本班现有学生9人,其中男生3人,女生6人.三年级学生已经有两年的数学学习经历,对一些基础性的数学知识有了初步的认识. ...

  2. 米的换算单位和公式_小学三年级数学常用公式和单位换算,孩子复习宝典!

    1 单位换算小技巧 1.将同类单位从大到小或者从小到大依次排列 如长度单位:千米.米.分米.厘米 2.记住各单位之间的进率,高级单位X进率=低级单位:低级单位÷进率=高低单位,差多少位就进行多少次换算 ...

  3. trunc怎么进行日期相减_三年级数学日期计算方法全在这里了,不分版本,孩子预习用得上...

    小学数学三年级下册学习了年月日,很多孩子最迷惑的不是区分大月和小月,不是判断平年和闰年,不是计算开始时间.经过时间和结束时间,而是计算日期间隔时怎么区分两头都算.算头不算尾.算尾不算头,怎么记忆每种算 ...

  4. 华为杯数学建模2020什么时候出结果_关于东北三省数学建模联赛及“华为杯”研究生数学建模竞赛的通知...

    ▲ 99.99%的哈工程学子关注了我们 一.参赛对象 在校本科生.研究生 二.竞赛时间 2020年6月1日--6月20日,竞赛题目将于6月1日公布. 三.参赛形式及内容 1. 参赛形式:参赛学生自行组 ...

  5. vue 秒转换为时分秒_三年级数学上册时分秒换算口诀(附重点习题)

    三年级数学上册时分秒换算口诀(附练习题) 1 时间单位换算口诀 1世纪=100年 1年=12月 大月(31天)有:1月,3月,5月,7月,8月,10月,12月 小月(30天)的有:4月,6月,9月,1 ...

  6. 人教版计算机三年级教学目标,人教版小学三年级数学下册教学计划

    人教版小学三年级数学下册教学计划 日子在弹指一挥间就毫无声息的流逝,我们又将迎来新的教学工作,是时候写一份详细的教学计划了.相信大家又在为写教学计划犯愁了吧,下面是小编为大家收集的小学三年级数学下册教 ...

  7. d3.js 旋转图形_苏教版三年级数学上册第六单元平移、旋转和轴对称(6.1~6.2)微课视频 | 练习...

    在小学学习中,关键点就是积累足够多的基础知识,为今后更高级的学习奠定基础.今天小学基础知识库就为大家分享苏教版三年级数学上册第六单元平移.旋转和轴对称(6.1~6.2)微课视频 | 练习,希望对老师教 ...

  8. 数学脱式计算在线计算机,三年级数学脱式计算.doc

    三年级数学脱式计算.doc 三年级数学脱式计算 第 1 页 82443(2538)15 25892533 26735-3512224221640604(601-246)5(59-187)3(601-2 ...

  9. 三年级下册计算机课程工作计划,三年级数学下册教学工作计划

    时间真是转瞬即逝,我们的教学工作又将在忙碌中充实着,在喜悦中收获着,让我们一起来学习写教学计划吧.那么教学计划怎么写才能体现你的真正价值呢?下面是小编帮大家整理的人教版三年级数学下册教学工作计划(精选 ...

最新文章

  1. word笔记之选择性粘贴-设置默认粘贴为当前格式
  2. javascript模块化之CommonJS、AMD、CMD、UMD、ES6
  3. java内部错误2755_内部错误2755.(安装软件出问题啦)
  4. django mysql debug_部署前准备--使用Mysql之Django Debug Toolbar安装以及配置
  5. CodeForces 7D Palindrome Degree 字符串hash
  6. DB2 SQL 递归实现多行合并
  7. 【DP】剪草(jzoj 1510)
  8. mupdf java_mupdf库学习
  9. 让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)
  10. Flex 中 12 个简单实用的小技巧
  11. 课程体系包括哪些要素_利润的构成要素包括哪些部分
  12. CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
  13. 札记:android手势识别,MotionEvent
  14. Atitit 贝叶斯算法的原理以及垃圾邮件分类的原理
  15. 无盘服务器缓存,深入研究无盘服务器缓存
  16. 中国省份-市级城市数组
  17. r语言和python的区别-Python和R语言的区别_Python与R的区别和联系
  18. 极速PyQt5基础教程06:QtDesigner设计软件界面
  19. Flixel Dame 坦克大战(三)完成基本逻辑
  20. VT是什么?怎么打开教程

热门文章

  1. EVA新世纪福音战士剧场版:终 阿里云盘、百度网盘资源
  2. hadoop问题集(1)
  3. threeJS中4*4矩阵实现平移和旋转的原理
  4. 爬取搜搜问问的一个实例
  5. 想见识一下超级高铁?VR带你来体验
  6. Oracle12C安装配置
  7. 阿里负责人揭秘面试潜规则【转】
  8. spring获取配置文件的信息@Value @@ConfigurationProperties(prefix=“hel“)
  9. 设置silverlight启用剪贴板的功能
  10. URLDownloadToFile调用返回E_ABOR问题