当前位置:   article > 正文

Unity 点乘(Dot)、叉乘(Cross)判断移动方向、朝向等向量问题_unity3d c# 2个向量方向

unity3d c# 2个向量方向

Unity 点乘(Dot)、叉乘(Cross)判断移动方向、朝向等向量问题

项目中常会用到物体移动,追踪,判断两物体移动方向是否相同,两物体移动方向夹角,以及物体 A 朝 物体 B 顺时针方向还是逆时针方向移动。物体 A 在 物体 B 的前后左右方向。 
下面通过点乘(Dot)、叉乘(Cross), 得到上面的需求结果。

代码如下


  1. using UnityEngine;
  2. using System.Collections;
  3. public class VectorDotCross : MonoBehaviour {
  4. // 关于点积
  5. private void Dot()
  6. {
  7. /*
  8. 点积
  9. 点积的计算方式为: a·b=|a|·|b|cos<a,b> 其中|a|和|b|表示向量的模,
  10. <a,b>表示两个向量的夹角。 通过点积判断当两个向量的方向向是否相同
  11. (大致相同即两个向量的夹角在 90 度范围内)
  12. 两个向量的 点积 大于 0 则两个向量夹角小于 90 度, 否则 两个向量的
  13. 夹角大于 90 度,
  14. */
  15. // 定义两个向量 a、b
  16. Vector3 a = new Vector3(1, 1, 1);
  17. Vector3 b = new Vector3(1, 5, 1);
  18. // 计算 a、b 点积结果
  19. float result = Vector3.Dot(a, b);
  20. // 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]
  21. float angle = Vector3.Angle(a, b);
  22. // 下面获取夹角的方法,只是展示用法,太麻烦不必使用
  23. // 通过向量点积获取向量夹角,需要注意,必须将向量转换为单位向量才行
  24. // 计算 a、b 单位向量的点积
  25. result = Vector3.Dot(a.normalized, b.normalized);
  26. // 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)
  27. float radians = Mathf.Acos(result);
  28. // 将弧度转换为 角度
  29. angle = radians * Mathf.Rad2Deg;
  30. }
  31. // 关于叉乘
  32. private void Cross()
  33. {
  34. /*
  35. 叉积
  36. 叉积的定义: c = a x b 其中a,b,c均为向量。两个向量的叉积是向量, 向量的模为 |c|=|a||b|sin<a,b>
  37. 且 向量 c 垂直于 a、b, c 垂直于 a、b 组成的平面, a x b = - b x a;
  38. */
  39. // 定义两个向量 a、b
  40. Vector3 a = new Vector3(1, 1, 1);
  41. Vector3 b = new Vector3(1, 5, 1);
  42. //计算向量 a、b 的叉积,结果为 向量
  43. Vector3 c = Vector3.Cross(a, b);
  44. // 下面获取夹角的方法,只是展示用法,太麻烦不必使用
  45. // 通过反正弦函数获取向量 a、b 夹角(默认为弧度)
  46. float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
  47. float angle = radians * Mathf.Rad2Deg;
  48. // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,下面以X、Z轴组成的平面为例(忽略 Y 轴)
  49. // 以 Y 轴为纵轴
  50. // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向
  51. if (c.y > 0)
  52. {
  53. // b 在 a 的顺时针方向
  54. }
  55. else if (c.y == 0)
  56. {
  57. // b 和 a 方向相同(平行)
  58. }
  59. else
  60. {
  61. // b 在 a 的逆时针方向
  62. }
  63. }
  64. // 获取两个向量的夹角 Vector3.Angle 只能返回 [0, 180] 的值
  65. // 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
  66. // 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角
  67. private void GetAngle(Vector3 a, Vector3 b)
  68. {
  69. Vector3 c = Vector3.Cross(a, b);
  70. float angle = Vector3.Angle(a, b);
  71. // b 到 a 的夹角
  72. float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
  73. float signed_angle = angle * sign;
  74. Debug.Log("b -> a :" + signed_angle);
  75. // a 到 b 的夹角
  76. sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
  77. signed_angle = angle * sign;
  78. Debug.Log("a -> b :" + signed_angle);
  79. }
  80. }

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

闽ICP备14008679号