游戏开发之数学知识汇总
在程序开发过程遇到的数学问题,将其原理记录下来,这样针对性的学习总结要比全部捡起,更有可行性、更靠谱!
- 坐标系
为了表示位置,距离,方向等相关关系,使用三维的笛卡尔坐标系。 左手坐标和右手坐标系的鉴别方法:拇指食指中指分别代表xyz,指头方向为正方向。如果左手和当前坐标轴对应就是左手坐标系,反之为右手坐标系。上图为左手坐标系。 左手法则和右手法则,在左手坐标系里使用左手法则;在右手坐标系里使用右手法则。比如(0,0,1)在坐标系统中绕Y轴正方向旋转90度(旋转后坐标为(1,0,0)左右坐标系都一样),判断正方向的方法是在左手坐标系中,使用左手握住Y轴,4个指头指向的方向就是正方向。右手坐标系统则使用右手。 在unity3d中Vector3的forward,right,up在左手坐标系中,forward表示z轴的前方,right表示x轴正方向,up表示y轴正方向。(左手坐标系:右手指向x轴,头顶y轴,面向z轴)
- 矢量运算
矢量与标量相乘除:K_V = _(K_Vx+ KVy+KVz) 矢量与矢量相加减:A_ + B = (A_x+Bx,Ay+By,Az+Bz),三角形法则如下图: 矢量的模:
单位矢量:模为1的矢量(归一化) 零矢量:V=_(0,0,0) 矢量的点积公式一:
矢量点乘的几何意义:矢量b在单位矢量a上的投影
)公式二:
矢量的叉积公式一:
公式二:
矩阵运算 矩阵与标量相乘:
矩阵与矩阵相乘:A(r行n列)乘以B(n行c列)得AB(r行c列),A的列数必须与B的行数相同 AB元素的值:A的i行矢量乘以B的j列矢量,公式为:
矩阵类型: 方阵(对角矩阵):行列相同 单位矩阵(I):MI=IM = M 转置矩阵:A(r行c列)转置为A(c行r列)
逆矩阵:必须为方阵(非零)MM = MM = I (M为逆矩阵)称为可逆的非奇异的否则称为不逆的,奇异的逆矩阵的逆矩阵为自己;I的逆矩阵为I;转置矩阵的逆矩阵是逆矩阵的转置;AB的逆等于B(逆)乘以A(逆) 正交矩阵:MM = MM = I(M为转置矩阵),M(转置) = M(逆) 正交基:基矢量相互垂直 标准正交基:正交基的所有基矢量长度为1 行矩阵列矩阵:Unity中矢量是列矩阵的形式表示的,放在矩阵的右侧 矩阵 = 变换(旋转缩放平移) 线性变换:矢量加和标量乘(旋转,缩放,错切,镜像,正交投影) 仿射变换:合并线性变换和平移变换(非线性变换),4x4的矩阵表示,即齐次坐标空间 基础变换:仅平移,仅旋转,仅缩放
M(3x3)表示旋转和缩放,t(3x1)表示平移,0(1x3)零矩阵,右下角为标量1. 平移矩阵:
缩放矩阵:
k(x),k(y),k(z)相同为统一缩放,否则为非统一缩放 旋转矩阵:
复合变换:
从右向左,先缩放,再旋转,再平移(绝大多数情况下) 复合缩放:unity顺利zxy
直线方程的公式有以下几种: 斜截式:y=kx+b 点斜式:y-y1=k(x-x1) 两点式:(y-y1)/(x-x1)=(y-y2)/(x-x2) 截距式:x/a+y/b=1 一般式 点(x0,y0)到直线:Ax+By+C=0的距离: |AXo+BYo+C|/√(A²+B²) 直线的方向向量:(1,k)
点到直线的距离公式:
公式描述:公式中的直线方程为Ax+By+C=0,点P的坐标为(x0,y0)。
负数的二进制 负数以其正值的补码形式表示的,如: 5的二进制:00000000 00000000 00000000 00000101 5的二进制反码:11111111 11111111 11111111 11111010 5的二进制补码:11111111 11111111 11111111 11111011 (反码加1)
[-1,1]映射到[0,1]:pixel = (normal +1)/2
位运算符有:按位与、按位或、按位非、按位异或。 与:& 都为1则为1 或:| 有一个为1则为1 非(取反):~ 按位取反 异或:^ 不同为1(如1和0,0和1),相同为0(0和0,1和1) 位运算的几个经典用途: 1. 取x串中的低四位:x&0xF2. 将x串中低四位变成1,其他位不变:x|0xF 3. 将x串中低四位取反:x^0xF 4. 将x串的低四位变成0:x&~0xF
中缀算式和后缀算式,原理? 中缀:(3+X*Y)-2Y/3 后缀:3 X Y * + 2 Y * 3 / -
二叉树 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。
遍历:
前序遍历:根节点->左子树->右子树 A B D G H E C K F I J 中序遍历:左子树->根节点->右子树 G D H B E A K C I J F 后序遍历:左子树->右子树->根节点 G H D E B K J I F C A
右乘和左乘 v1 = (x,y,z) 行矩阵1x3;v2 = (x,y,z)(v1的转置) 列矩阵3x1; 左乘:工程数学中,用到两个矩阵相乘的时候,矩阵A×矩阵B,那么就称为A左乘以B。 矩阵相乘才有左乘和右乘的区别 矩阵左乘是行变换,右乘列变换
求和公式 自然数1..n求和:
自然数n..m求和:
等差求和:
等比求和:
速度,加速度,距离 Vt:末速 Vo:初速 a:加速度 S:位移 t:时间 等加速度五个公式,每个公式都取其中四个量来运算:(其中Vo^2=初速平方,以此类推) S=Vo^2+a(t^2)/2 S=Vt^2+a(t^2)/2 Vt=Vo+at S=(Vo+Vt)*t/2 Vt^2=(Vo^2)+ 2aS 斜抛的公式H=V^2 * sin^2 x / 2g T=2VsinX/g R=V^2 * sin2x /g
四元数 Quaternion = (xi + yj + zk + w ) = (x,y,z,w),(x,y,z) 跟旋转轴有关, w 与绕旋转轴旋转的角度有关,因为它们都要经过代数运算才能得出旋转轴和旋转角度 在unity3d中, quaternion 的乘法操作 (operator * ) 有两种操作: (1) quaternion * quaternion , 例如 q = t * p; 这是将一个点先进行t 操作旋转,然后进行p操作旋转. (2) Quaternion * Vector3, 例如 p : Vector3, t : Quaternion , q : Quaternion; q = t * p; 这是将点p 进性t 操作旋转; 我进行的是第2种操作,即对一个向量进行旋转; 首先 ,Quaternion 的基本数学方程为 : Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2)) (a 为旋转角度) Q.w = cos (angle / 2) Q.x = axis.x * sin (angle / 2) Q.y = axis.y * sin (angle / 2) Q.z = axis.z * sin (angle / 2) 我们只要有角度就可以给出四元数的四个部分值,例如我想要让点M=Vector3(o,p,q) 绕x轴顺时针旋转90度;那么对应的quaternion数值就应该为: Q : Quaternion; Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071 Q.y = 0; Q.z = 0; Q.w = cos(90度/2) = cos (45度) = 0.7071 Q = (0.7071, 0 , 0 , 0.7071); m = Q * m; (将点m 绕 x轴(1,0,0) 顺时针旋转了90度)
var m : Vector3;
var t1 : Quaternion; m = Vector3(1,0,0); t1 = Quaternion(0.7,0,0,0.7); m = t1*m;
这是quaternion 的最基本用法,主要给出角度,就可以算出Quaternion,然后对点坐标进行旋转。原文
未完
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com
文章标题:游戏开发之数学知识汇总
文章字数:1.9k
本文作者:max-xue
发布时间:2017-01-05, 11:04:33
最后更新:2019-11-08, 17:59:30
原始链接:http://blog.le-more.com/2017/01/05/game/e5-bc-80-e5-8f-91-e4/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。