A表示向量 a表示线段长度
image.png
//向量计算公式
A = (x,y,z);
B = (i,j,k);
A · B = x * i + y * j + z * k;(数学计算方式)
图中可以看出 C向量计算方式如下:
C = A -B;
同时平方展开
|C|^2 = |A|^2 + |B|^2 - 2A·B;
c^2 = a^2 + b^2 - 2A·B;
图中通过三角形余弦定理:可以获取到
c^2 = a^2 + b^2 - 2 |a| |b| cosθ
上面两个方程 联合使用可以得到
A·B = |a| |b| cosθ
θ = arccos(A·B/|a| |b|)
应用场景: 敌人和玩家 两三维个点 计算敌人需要旋转多少度可以面向敌人 (缺点:计算出来的角度小于180°.因为两个向量的夹角不会超过180°,如果顺时针超过180° 就会从逆时针方向计算角度)
二维向量叉乘的定义
A = (x,y)
B = (m,n)
A x B = 2x2的行列式 = x *n - y * m;
三维向量叉乘定义 i j k 分别代表笛卡尔坐标系中的 x y z 轴的单位向量
A = (a1,a2,a3)
B = (b1,b2,b3);
image.png
展开获得:
C = AxB = (a2 * b3 - a3 * b2,a1 * b3 - a3 * b1,a1 * b2 - a2 * b1);
可以看出两个向量叉乘后得到的是一个C向量 (使用左手定则快速判断C向量的方向)
几何意义:如下
image.png
C的模长 = A模长 * B模长 * sinθ ;
(通过这个公式 也可以计算两个向量的家度缺点这个角度小于等于90度)
游戏中的应用场景:
1.解决向量点乘无法计算超过180°的问题
Vector3 pos1 = new Vector3(10, 20, 30);
Vector3 pos2 = new Vector3(50, 10, 5);
//计算两个向量之间的角度
//计算公式 cosθ = A·B/a*b 这里将他们转化成单位向量 a = b = 1 就不用除了
float cosθ = Vector3.Dot(pos1.normalized, pos2.normalized);
//反三角函数获取到弧度
float θ = Mathf.Acos(cosθ);
//将弧度转化成角度
float angle = θ * Mathf.Rad2Deg;
//计算两个三维向量的叉乘
Vector3 pos3 = Vector3.Cross(pos1, pos2);
//小于零说明 叉乘结果向量向下 pos1->pos2的顺时针角度大于180度
if (pos3.y<0)
{
//获得大于180°的角
angle = 360 - angle;
}
2.获取一个向量垂直已知的两个向量
3.判断两个向量的顺逆时针关系
网友评论