2019-10-10 15:54:16 qq_42139931 阅读数 14

点乘积
点乘积的计算方式为: a * b = |a| * |b| cos<a,b>,其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。另外在点乘积中,<a,b>和<b.a>夹角是不分顺序的。所以通过点乘积,其实是可以计算两个向量的夹角的。
因此使用点乘积的一个作用就是通过计算两个向量的点乘积,可以粗略地判断当前物体是否朝向另一个物体,只需要计算当前物体的transform.forward向量与(target.transform.position - transform.position)的点乘积即可,大于0则面对另一个物体,否则是背对着。

交叉乘积
叉积的定义: c = a * b, 其中a、b、c均为向量,即两个向量的交叉乘积得到的还是向量。
向量的交叉乘积的3条性质:
1:c垂直a,c垂直b,即向量c垂直与向量a、b所在的平面
2:模长|c| = |a||b|sin<a,b>。
3:满足右手法则。有a * b != b * a, 而a * b = - b * a,可以使用交叉乘积的正负值来判断向量a、b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。

向量的点乘积和交叉乘积的区别代码如下。

using UnityEngine;
using System.Collections;

public class MainScript : Monobehaviour
{
    private Vector3 a;
    private Vector3 b;
    
    void Start()
    {
        a = new Vector3 (1, 2, 1);
        b = new Vector3 (5, 6, 0);
    }
    
    void OnGui()
    {
        float c = Vector3.Dot(a, b);
        float angle = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized)) * Mathf.Rad2Deg;
        GUiLayout.Label("向量a,b的点积为:" + c);
        GUILayout.Label("向量a,b的夹角为:" + angle);
        
        Vector3 e = Vector3.Cross(a, b);
        Vector3 d = Vector3.Cross(b, a);
        angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;
        GUiLayout.Label("向量a * b为:" + e);
        GUiLayout.Label("向量b * a为:" + d);
        GUILayout.Label("向量a,b的夹角为:" + angle);        
    }
}
2016-06-09 17:56:53 tianshenshangjie 阅读数 4521


1. 点乘

1.理论和推导

术语点乘来自A·B中的点号(点乘·  叉乘* )向量点乘对应分量乘机的和,它结果是一个标量它的公式 

A·B=Ax*Bx+AyBy+AzBz例如(3,1,-1)·(7,2,1)=3*7+1*2+(-1)*1=22

看下图就好。感受手写比打字方便多了呀!!!!

2.项目中的应用

点乘结果描述的是两个向量之间的相识度,点乘的结果越大向量约靠近,所以完全可以用点乘的结果来确定向量A

和向量B之间的夹角。 用VectorAPI得到cos值,然后用Mathf类算出角度

 查看API :Vector 点乘API

点乘的结果除了可以确认向量A和向量B之间的夹角大小之外,还可以用来求向量的投影。其原理就是把

向量分解成平行和垂直的其他两个向量。这个自行想象吧

2. 叉乘

1.理论

和点乘一样,叉乘的术语是因为A x B中的x这个符号,点乘得到的结果是一个标量,儿叉乘得到的结果是一个向量
又一次打字太难受了,还是写方便很多,你直接看图推导公式吧
这段推导的下面三行忽略吧。我想试着推导下点乘和叉乘的关系的。 我也是傻逼哦

2.项目中的应用

看了推导,你大概都能知道叉乘能做什么了把,AB叉乘的结果会向量C垂直向量AB, 然后你通过判断C的正负值来判断他们处于方向



白色的向量就是点乘的结果。 查看向量C 的y值 朝上的时候是(0,85.4,0) 向量C朝下的时候 Vector值 (0,-90.54,0)



代码如下

using UnityEngine;
using System.Collections;

public class CrossTest : MonoBehaviour {


    public Transform a;
    public Transform b;

    public Vector3 _c = Vector3.zero;
    void Start()
    {
       
    }
 
    void Update()
    {
        Debug.DrawLine(Vector3.zero, a.position, Color.blue);

        Debug.DrawLine(Vector3.zero, b.position,Color.red);

        Debug.DrawLine(Vector3.zero, _c,Color.white);
    }
        
    void OnGUI()
    {

        _c = Vector3.Cross(a.position, b.position);
        
        //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        float angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.position.normalized, b.position.normalized))) * Mathf.Rad2Deg;
        GUILayout.Label("向量a,b的夹角为:" + angle);
    }
}

总结一句话:点乘可以判断向量之间的夹角,叉乘可以判断向量之间的方向在顺时针还是逆时针方向


2016-08-05 19:15:16 u011484013 阅读数 3690

一、向量

1、向量的数学定义

向量就是一个数字列表,对于程序员来说一个向量就是一个数组。
向量的维度就是向量包含的“数”的数目,向量可以有任意正数维,标量可以被认为是一维向量。
书写向量时,用方括号将一列数括起来,如[1,2,3] 水平书写的向量叫行向量 垂直书写的向量叫做列向量
2、向量的几何意义

几何意义上说,向量是有大小和方向的有向线段。向量的大小就是向量的长度(模)向量有非负的长度。
向量的方向描述了空间中向量的指向。
向量的形式:向量定义的两大要素——大小和方向,有时候需要引用向量的头和尾,下图所示,箭头是向量的末端,箭尾是向量的开始
这里写图片描述
向量中的数表达了向量在每个维度上的有向位移,例如2D向量列出的是沿x坐标方向和y坐标方向的位移。
3 unity中的向量 Vector类
Vector2 二维向量,表示 2D 的向量和点
Vector3 三维向量,表示3D的向量和点
Vector3.normalized 规范化,返回向量的长度为1(只读)。
Vector3.magnitude 长度,返回向量的长度(只读)。
Vector3.Angle 角度 , Angle (from : Vector3, to : Vector3) ,由from和to两者返回一个角度。形象的说,from和to的连线和它们一个指定轴向的夹角

二、点乘

1 点乘的数学意义
这里写图片描述
2 点乘的几何意义
这里写图片描述
3点乘的特点
在向量u,向量v非零的前提下,点积如果为负,则u,v形成的角大于90度;
如果为零,那么u,v垂直;
如果为正,那么u,v形成的角小于90度。
3 点乘在unity中的应用
Vector3.Dot 点乘,对于normalized向量,如果他们指向在完全相同的方向,Dot返回1。如果他们指向完全相反的方向,返回-1。对于其他的情况返回一个数(例如:如果是垂直的Dot返回0)。对于任意长度的向量,Dot返回值是相同的:当向量之间的角度减小,它们得到更大的值。

三、叉乘

1 叉乘的数学意义
表示方法
两个向量a和b的叉积写作a×b(有时也被写成a∧b,避免和字母x混淆)。
定义
向量积可以被定义为:
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)
这里写图片描述
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。)

也可以这样定义(等效):
向量积|c|=|a×b|=|a| |b|sin

四、点乘与叉乘在项目中的应用

项目需求:
1 通过点乘计算物体B在物体A的前方还是后方
2 通过叉乘,计算物体A转向物体B时,最小角的旋转方向

实现过程:
首先计算出物体A的前方朝向向量v_Bz=B.transform.forward,然后计算物体B相对于物体A的位置向量 v_AB = A.position - B.position;

通过计算v_Bz与v_AB向量点乘结果的正负,判断物体B在物体A的前后
如果物体B在物体A前方, Vector3.Dot(v_Bz,v_AB)大于0
如果物体B在物体A后方, Vector3.Dot(v_Bz,v_AB)小于0

通过计算v_Bz与v_AB向量叉乘的结果,判断旋转方向
如果逆时针旋转,v_C = Vector3.Cross(v_Bz, v_AB)为沿y轴负方向
如果顺时针旋转,v_C = Vector3.Cross(v_Bz, v_AB)为沿y轴正方向

using UnityEngine;
using System.Collections;

public class Vector3_Dot : MonoBehaviour {

    public Transform A, B;
    Vector3 v_Bz, v_AB, v_A,v_B,v_C;
    string str = "";



    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {


        //点乘
        v_Bz = B.transform.forward;//B.transform.TransformDirection(Vector3.forward);
        v_AB = A.position - B.position;
        float f = Vector3.Dot(v_Bz,v_AB);
        if (f>0)
        {
            str = "A在B自身座标系的前方";
        }
        else if (f<0)
        {
            str = "A在B自身座标系的后方";

        }
        else
        {
            str = "A在B自身座标系的左前方或右方";
        }

        //差乘
        v_A = A.position;
        v_B = B.position;
        v_C = Vector3.Cross(v_Bz, v_AB);
       // A.Rotate(0,0,0);

    }

    void OnGUI()
    {
        GUI.Label(new Rect(10,10,200,60),str);

    }



    void OnDrawGizmos()
    {
        //差乘绘制相关线
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(-v_C,Vector3.zero);



        //点乘绘制相关线
        Gizmos.color = Color.yellow;
        Gizmos.DrawLine(Vector3.zero,A.position);

        Gizmos.color = Color.yellow;
        Gizmos.DrawLine(Vector3.zero,B.position);

        Gizmos.color = Color.red;
        Gizmos.DrawLine(A.position, B.position);

        Gizmos.color = Color.red;
        Gizmos.DrawLine(Vector3.zero,v_AB);

        Gizmos.color = Color.green;
       // Gizmos.DrawLine(A.transform.position, Vector3.left);

    }
}

这里写图片描述
总结:
点乘可以判断向量之间的夹角,叉乘可以判断向量之间的方向在顺时针还是逆时针方向

2016-01-11 10:07:10 ldy597321444 阅读数 1078

点乘:两个向量点乘得到一个标量 ,数值等于两个向量长度相乘后再乘以二者夹角的余弦值 。如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度

点乘后得到的是一个值

若结果 == o,则 两向量 互垂直 。
若结果 < 0  ,则 两向量夹角大于90°。
若结果 >0  ,则两向量夹角小于 90°。


 点积的计算方式为:  a·b=|a|·|b|cos<a,b>  其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。另外在 点积 中,<a,b>和<b,a> 夹角是不分顺序的。所以通过点积,我们其实是可以计算两个向量的夹角的。另外通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 (otherObj.transform.position – transform.position)的点积即可, 大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。


叉乘:两 个向量的叉乘得到一个新的向量 ,新向量垂直于原来的两个向量再乘夹角的正弦值 

叉乘后得到的还是一个向量


在unity3D里面。两个向量的点乘所得到的是两个向量的余弦值,也就是-1 到1之间,0表示垂直,-1表示相反,1表示相同方向。 两

个向量的叉乘所得到的是两个向量所组成的面的垂直向量,分两个方向。 简单的说,点乘判断角度,叉乘判断方向。 形象的说当一个

敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所

成的角度大小


叉积的定义: c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量

               性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。 
               性质2: 模长|c|=|a||b|sin<a,b>


5,向量的投影

        介绍:
                va向量在vb向量上的投影又可以称为a向量在b向量上的分量。
       方法:
                Vector3.Project(va,vb)
6,向量的反射
        介绍:
                V对于法线N的反射,这个最有意思了,想想一下光反射或者桌球反弹,就是那个概念。可以用于模拟一下物理碰撞。
       方法:
                Vector3. Reflect (V, N);     (  此处法线 N 需要标准化 )

2017-08-17 14:26:14 yy1042001041 阅读数 397

在unity3D里面。两个向量的点乘所得到的是两个向量的余弦值,也就是-1 到1之间,0表示垂直,-1表示相反,1表示相同方向。

两个向量的叉乘所得到的是两个向量所组成的面的垂直向量,分两个方向。

 

简单的说,点乘判断角度,叉乘判断方向。

形象的说当一个敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

没有更多推荐了,返回首页