赞
踩
两个向量的点乘,就是我们说的数量级
a·b=|a|·|b|cosθ
结果是一个标量,如果==0,则两个向量夹角等于90度,垂直关系
小于0,则两个向量夹角大于90度
大于0,则两个向量夹角小于90度
如果cosθ 等于-1,则两个向量相反,等于1则两个向量同向
如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度
两个向量的叉乘,得到的是一个向量,是一个矢量,垂直于原来两个向量组成的平面,有两个方向。
c = a x b,其中a b c均为向量
模长|c| = |a||b| sinθ
在unity里面当敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。
代码如下:
- void Start ()
- {
- Vector3 a = new Vector3(2, 0, 2);
- Vector3 b = new Vector3(-2,0,0);
- MyDot(a, b);
- MyCross(a, b);
- }
-
- //点乘
- private void MyDot(Vector3 a, Vector3 b)
- {
- //点乘结果
- float _result1 = Vector3.Dot(a, b);
-
- //角度[0-180]
- float _angle1 = Vector3.Angle(a, b);
-
- //也可通过 单位向量 来计算角度
- //_result2 为夹角余弦值
- float _result2 = Vector3.Dot(a.normalized, b.normalized);
- //反余弦函数来求对应的弧度
- float _temp = Mathf.Acos(_result2);
- //弧度转角度[0,90]
- float _angel2 = Mathf.Rad2Deg * _temp;
-
-
- Debug.Log(string.Format("角度1:{0},角度2:{1}", _angle1, _angel2));
- }
-
-
- //叉乘
- private void MyCross(Vector3 a, Vector3 b)
- {
- //叉乘结果
- Vector3 _result3 = Vector3.Cross(a, b);
- //获取两个向量夹角(弧度)
- float _temp = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
- float _angel3 = Mathf.Rad2Deg * _temp;
-
- Debug.Log("角度3:" + _angel3);
-
- // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
- //下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
- // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
- if (_result3.y > 0)
- {
- // b 在 a 的顺时针方向
- Debug.Log("b 在 a 的顺时针方向");
- }
- else if (_result3.y == 0)
- {
- // b 和 a 方向相同(平行)
- Debug.Log("b 和 a 方向相同");
- }
- else
- {
- // b 在 a 的逆时针方向
- Debug.Log("b 在 a 的逆时针方向");
- }
-
-
-
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。