数学是游戏引擎的基础,数学也是游戏机制的基础,本章将要介绍游戏中最普遍、最基础的一些数学问题。
坐标系
左手坐标系、右手坐标系
笛卡尔坐标系用来描述物体的坐标信息
笛卡尔坐标系又分为左手坐标系和右手坐标系
两者坐标系中的x轴和y轴朝向一样,x轴指向右边,y轴指向上边,关键是z轴的朝向不同
左手坐标系:伸出左手,四指由x轴弯向y轴,大拇指的朝向即为z轴方向
右手坐标系:伸出右手,四指由x轴弯向y轴,大拇指的朝向即为z轴方向
两坐标系是镜像对称的,我们的手也是镜像对称的
Unity坐标系:Unity采用的是左手坐标系,x轴、y轴、z轴默认指向为右、上、前,坐标值用三个数表示(x,y,z)
世界坐标系
世界坐标系也称为全局坐标系,是游戏中所有物体和方向的基准,类似于现实世界的东南西北
原点(0,0,0)是所有物体的基准
局部坐标系
局部坐标系也称为本地坐标系,子物体会以父物体的坐标系作为定位自身的坐标系,类似于现实世界的前后左右
特例:摄像机坐标系,摄像机作为一个组件,挂载在某个物体上,那个物体的坐标系也就是摄像机的坐标系,好处就是方便判断物体是否在摄像机前面以及物体之间的前后遮挡关系
屏幕坐标系
手机屏幕或者电脑屏幕的一个坐标系
屏幕坐标是以像素来定义的, 屏幕左下角为原点(0,0), 右上角为(Screen.width,Screen.height)
width是屏幕的宽度, height是屏幕的高度
Z值是摄像机世界坐标取反,并且以相机的世界单位来衡量的
屏幕坐标和相机之间满足:
Screen.width = Camera.main.pixelWidth
Screen.height = Camera.main.pixelHeight
鼠标的位置坐标属于屏幕坐标,通过Input.mousePosition获取鼠标的屏幕坐标
坐标系间的变换
局部坐标转换成世界坐标:transform.TransformPoint()
世界坐标转换成局部坐标:transform.InverseTransformPoint()
局部向量转换成世界向量:transform.TransformDirection()
世界向量转换成局部向量:transform.InverseTransformDirection()
对物体的移动:transform.Translate()
Vector3.forward
是物体自身坐标系下的上方,要想让物体向世界坐标系的上方移动,需要转换一下
向量
向量的运算
加法:平行四边形法或者首尾相接法
减法:加上一个负向量或者减向量的终点指向被减向量的终点
点乘:向量点乘等于两者长度相乘,再乘以夹角的余弦值(用来计算角度)
叉乘:向量叉乘等于两者长度相乘,再乘以夹角的正弦值,方向为左手由第一个向量弯向第二个向量,大拇指所指的方向(用来判断方向)
位置与向量的区别
两者的表示方法都一样,(x,y,z)
记住transform.position
是位置,两位置相减是向量
其他的根据数学知识来判断
Vector3结构体
切记,结构体是值类型,Vector3是值类型
字段(属性)
- x
- y
- z
- normalized:单位化向量
- magnitude:得到长度
- sqrMagnitude:得到长度的平方,速度更快
方法
- Cross:叉乘
- Dot:点乘
- Project:投影
- Angle:角度
- Distance:距离
+
-
*
/
==
!=
Vector3的用法
获取两个物体间的距离
float dist = Vector3.Distance(otherObject.position, transform.position);
缓动效果
transform.position = Vector3.Lerp(transform.position, target, 0.3f);
越靠近,移动速度越慢,因为每次移动剩余距离的30%
矩阵
一般是4×4矩阵
可以分为平移矩阵、旋转矩阵、缩放矩阵
还可以对一系列矩阵相乘得到组合矩阵
齐次坐标
齐次坐标就是将三维变量(x,y,z)用四维向量(x,y,z,w)来表示
好处:
- 更好地区分向量和坐标点
- 统一用矩阵乘法来表示平移、旋转、缩放变换
四元数
详见书本P253