游戏数学之linear algebra(一)
本文转自我的公众号—游戏开发手账
转载请标明出处
当你发现自己一进游戏世界就找不到北的时候,你心里就该清楚这点了,欠下线代大爹的债死也不还总是要还的。
右手系和左手系
这个找不到北的问题的起点,可能要从坐标系说起,左手系和右手系的区别在于它们笛卡尔坐标轴中有一个轴的方向是不同的(在游戏中通常为z轴),一个判断左手系和右手系的方法,拇指食指中指三者两两呈90°摆好,看看哪个手对的上。
一般的设定是,中指为x轴向右,拇指为y轴向上,这样你会发现左手系中食指的指向(z轴正向)是向远离你的方向,右手系中是接近你的方向。
好的,这样单纯在自己的视角上,算是找得到北了。
矢量运算
-
矢量和标量的乘法
- 可以把相乘的标量当作缩放因子,矢量 n ⃗ \vec n n,标量 a a a, a n = ( a x n ⃗ x , a y n ⃗ y , a z n ⃗ z ) an = (a_{x}\vec n_{x} ,a_{y}\vec n_{y}, a_{z}\vec n_{z}) an=(axnx,ayny,aznz),如果 a a a中的每个分量值不同,这种缩放称为非统一缩放。
-
矢量的加减法
- 矢量的加减法将矢量中每个分量分别相加/减即可。
-
矢量的模
-
用于求长度。
-
矢量运算可以用于人物移动,根据本帧位置和速度求人物下一帧位置;还可用于物体的碰撞/相交检测(矢量减法再求模)。
-
矢量的点积和叉积
- 点积有什么用处
-
当点积中一个矢量是单位向量时,所得值为另一矢量在该单位向量方向上的投影长度📏。
-
-
利用点积,可以判定两矢量的方向大致在什么样的相对方向上。所得值大于零的话,二者夹角小于90°,反之大于90°(分别对应下图的红色部分和蓝色部分),等于零时二者方向垂直。更多的,还可以判断是否共线或反向共线。
-
-
应用的话,你可以考虑这样的功能:当你要实现TPS游戏中的“自由视角”功能时(自由视角是指切换成此类视角时,人物呈原地站立状,鼠标的移动不再和人物的视角方向绑定,通过鼠标的移动,你可以环绕地观察自身角色,当镜头朝向人物时,人物的视线会注视向镜头的方向),为了写镜头在人身后和在前面面向人物的不同逻辑,可以用点积判断二者的相对角度并分写逻辑。
-
具体来说,人物位置 p ⃗ \vec p p,相机位置 c ⃗ \vec c c,人物朝向 f ⃗ \vec f f, c ⃗ − p ⃗ \vec c - \vec p c−p得到人物至相机的矢量,再点积人物朝向。 f ⃗ \vec f f
-
- 关于叉积
- 叉积的方向垂直于相乘的两个矢量构成的平面,模为 ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin θ |\vec a||\vec b|\sin θ ∣a∣∣b∣sinθ,叉积模的值等于两矢量构成的平行四边形的面积,叉积可以用于求平面的法矢量。
- 要注意的是叉积的方向会根据坐标系的选择而改变,当使用右手坐标系时,叉积方向的判断使用右手法则,左手坐标系时使用左手法则。
- 以右手法则举例,四指指向