当前位置:   article > 正文

Unity中的叉乘和点乘_unity点乘和叉乘

unity点乘和叉乘

两个向量的点乘,就是我们说的数量级 

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里面当敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

代码如下:

  1. void Start ()
  2. {
  3. Vector3 a = new Vector3(2, 0, 2);
  4. Vector3 b = new Vector3(-2,0,0);
  5. MyDot(a, b);
  6. MyCross(a, b);
  7. }
  8. //点乘
  9. private void MyDot(Vector3 a, Vector3 b)
  10. {
  11. //点乘结果
  12. float _result1 = Vector3.Dot(a, b);
  13. //角度[0-180]
  14. float _angle1 = Vector3.Angle(a, b);
  15. //也可通过 单位向量 来计算角度
  16. //_result2 为夹角余弦值
  17. float _result2 = Vector3.Dot(a.normalized, b.normalized);
  18. //反余弦函数来求对应的弧度
  19. float _temp = Mathf.Acos(_result2);
  20. //弧度转角度[0,90]
  21. float _angel2 = Mathf.Rad2Deg * _temp;
  22. Debug.Log(string.Format("角度1:{0},角度2:{1}", _angle1, _angel2));
  23. }
  24. //叉乘
  25. private void MyCross(Vector3 a, Vector3 b)
  26. {
  27. //叉乘结果
  28. Vector3 _result3 = Vector3.Cross(a, b);
  29. //获取两个向量夹角(弧度)
  30. float _temp = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
  31. float _angel3 = Mathf.Rad2Deg * _temp;
  32. Debug.Log("角度3:" + _angel3);
  33. // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
  34. //下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
  35. // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
  36. if (_result3.y > 0)
  37. {
  38. // b 在 a 的顺时针方向
  39. Debug.Log("b 在 a 的顺时针方向");
  40. }
  41. else if (_result3.y == 0)
  42. {
  43. // b 和 a 方向相同(平行)
  44. Debug.Log("b 和 a 方向相同");
  45. }
  46. else
  47. {
  48. // b 在 a 的逆时针方向
  49. Debug.Log("b 在 a 的逆时针方向");
  50. }
  51. }

 

部分借鉴:https://blog.csdn.net/yupu56/article/details/53609028

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/756562
推荐阅读
相关标签
  

闽ICP备14008679号