Appearance
【向量运算】
定义
把方向和大小构成一个值,称其为向量,若其向量的大小为1,则称其为单位向量。
提示
不同的向量运算,需要确保是同一个空间里的向量。
向量长度
CSharp
public float magnitude { get { return (float)Math.Sqrt(x * x + y * y); } }
向量归一
让向量长度变为1。 也成为模向量。 x和y分别进行除以向量长度。
公式:
向量加法
- 空间里坐标点A和B, 那么 A+B的向量 = A与B 夹角中间的向量。
CSharp
new Vector2(a.x + b.x, a.y + b.y);
向量减法
- 空间里坐标点A和B, 那么 A->B的向量 = B - A。
- 比如地图上,存在玩家和怪物两个单位。 两个单位的坐标都知道了,那么角色与怪物在世界空间里构成的方向向量怎么求呢?这里就可以用到向量的减法了。 玩家 -> 怪物 的向量 = 怪物的坐标 - 玩家的坐标
CSharp
new Vector2(a.x - b.x, a.y - b.y);
实战案例
CSharp
public class TestVector : MonoBehaviour
{
public Transform a;
public Transform b;
[Range(0,4f)]
public float radius = 1f;
private void OnDrawGizmos() {
// A -> B 的向量
Vector3 aToBDir = b.position - a.position;
// A -> B 进行单位化
//aToBDir.Normalize();
// A -> B 进行单位化 的方式2
aToBDir = aToBDir/aToBDir.magnitude;
// 点C 位于与a到b的距离的一点
Vector3 c = aToBDir*radius;
// 绘制
Gizmos.DrawLine(a.position,a.position + aToBDir);
Gizmos.DrawSphere(a.position + c,0.05f);
}
}
向量加减法公式和示意图
向量点乘
- 结果为所形成投影长度。
- 经典应用场合:计算兰伯特光照模型,使用模型法线与光方向的反方向进行点乘,重合为1反向为-1,形成一个有一半球的面积有光渐变的效果,类似于被光照亮的光照模型。
公式1:
公式2:
CSharp
public static float Dot(Vector2 lhs, Vector2 rhs) { return lhs.x * rhs.x + lhs.y * rhs.y; }
向量叉乘
- 根据示意图可以看出,两个向量相反时,结果为0。
- 两个向量不满足交换律,AXB != BXA ,可把结果的正负来判断两个向量的左右关系。
平行四边形的面积
- 向量叉乘的结果为两个向量所构成平滑四边形的面积。
- 结果的一半为两个向量构成三角形的面积(计算模型表面积有用)。