Bootstrap

Unity中的点乘和点叉乘

点乘和叉乘的数学几何定义

点乘

对于向量a和b而言,向量a=[a1,a2,a3,a4……],向量b=[b1,b2,b3,b4……],所以点乘ab=a1b1+a2b2+a3b3+a4b4+……
而在几何定义上:a
b=|a||b|cos(theta)——theta代表数学几何里面的向量夹角,所以可得theta=arc cos(a*b/|a||b|)

叉乘

叉乘又称叉积、外积、向量积,两个向量叉乘出来的是一个向量,而这个向量是这两个向量相交所产生的二维平面的法向量,即这个向量与两个相交向量垂直。
假设向量a=[x1,y1,z1],向量b=[x2,y2,z2],则向量a向量b的叉乘为:aXb=(y1z2-y2z1)i-(x1z2-x2z1)j+(x1y2-x2y1)k
其中i=(1,0,0),j=(0,1,0),k=(0,0,1)
所以c=aXb=( y1z2-y2z1, -(x1z2-x2z1), x1y2-x2y1 ),几何定义|c|=|a||b|sin(theta),所以theta=arc sin(|c|/|a||b|)

Unity中的点乘和叉乘

点乘:Vector3.Dot(Vector3 a,Vector3b)
叉乘:Vector3.Cross(Vector3 a,Vector3 b)
代码示例:

//点乘与叉乘的应用
        Vector3 a = new Vector3(1, 2, 3);
        Vector3 b = new Vector3(4, 5, 6);
        //点乘
        float c = Vector3.Dot(a, b);
        //叉乘
        Vector3 d = Vector3.Cross(a, b);
        Vector3 e = Vector3.Cross(b, a);
        //根据点乘和叉乘求a,b之间的角度
        float f = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized)) * Mathf.Rad2Deg;
        float g = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;

        //输出结果
        Debug.Log("点乘:" + c + "叉乘:" + d + "……" + e);
        Debug.Log(string.Format("点乘角度:{0},叉乘角度{1}", f, g));

得出的结果是:
在这里插入图片描述
Vector3.normalized代表将这个向量单位化,也就是让这个向量的模长变为1
Vector3.Distance代表两个向量之间的距离
Vector3.zero代表(0,0,0)点
Mathf.Rad2Deg弧长转变成角度,Mathf.Deg2Rad角度转变成弧长