Skip to content

【向量运算】

定义

把方向和大小构成一个值,称其为向量,若其向量的大小为1,则称其为单位向量。

沉浸式数学书

提示

不同的向量运算,需要确保是同一个空间里的向量。

向量长度

CSharp
public float magnitude { get { return (float)Math.Sqrt(x * x + y * y); } }

向量归一

让向量长度变为1。 也成为模向量。 x和y分别进行除以向量长度。

公式: Markdown 图片

向量加法

  • 空间里坐标点A和B, 那么 A+B的向量 = A与B 夹角中间的向量。
CSharp
new Vector2(a.x + b.x, a.y + b.y);

动图示例2.5

向量减法

  • 空间里坐标点A和B, 那么 A->B的向量 = B - A。
  • 比如地图上,存在玩家和怪物两个单位。 两个单位的坐标都知道了,那么角色与怪物在世界空间里构成的方向向量怎么求呢?这里就可以用到向量的减法了。 玩家 -> 怪物 的向量 = 怪物的坐标 - 玩家的坐标
CSharp
new Vector2(a.x - b.x, a.y - b.y);

实战案例

Markdown 图片

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);
    }
}

动图示例2.8

向量加减法公式和示意图

Markdown 图片

Markdown 图片

Markdown 图片

向量点乘

  • 结果为所形成投影长度。
  • 经典应用场合:计算兰伯特光照模型,使用模型法线与光方向的反方向进行点乘,重合为1反向为-1,形成一个有一半球的面积有光渐变的效果,类似于被光照亮的光照模型。

公式1: Markdown 图片

公式2: Markdown 图片

CSharp
public static float Dot(Vector2 lhs, Vector2 rhs) { return lhs.x * rhs.x + lhs.y * rhs.y; }

向量叉乘

  • 根据示意图可以看出,两个向量相反时,结果为0。
  • 两个向量不满足交换律,AXB != BXA ,可把结果的正负来判断两个向量的左右关系。

平行四边形的面积

  • 向量叉乘的结果为两个向量所构成平滑四边形的面积。
  • 结果的一半为两个向量构成三角形的面积(计算模型表面积有用)。

MIT Licensed