Unity3D之Vector3.Dot和Vector3.Cross的使用

Posted jzdwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D之Vector3.Dot和Vector3.Cross的使用相关的知识,希望对你有一定的参考价值。

  在Unity3D中。Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积。
  点积计算的结果为数值,而叉积计算的结果为向量。两者要注意差别开来。

  在几何数学中:

  1.点积
  点积的计算方式为: a·b=|a|·|b|cos<a,b> 当中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。

另外在点积中,<a,b>和<b,a> 夹角是不分顺序的。


  所以通过点积,我们事实上是能够计算两个向量的夹角的。
  另外通过点积的计算我们能够简单粗略的推断当前物体是否朝向另外一个物体: 仅仅须要计算当前物体的transform.forward向量与 (otherObj.transform.position – transform.position)的点积就可以, 大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。


 2.叉积
  叉积的定义:c =a x b 当中a,b,c均为向量。即两个向量的叉积得到的还是向量。
  性质1:c⊥a。c⊥b,即向量c垂直与向量a,b所在的平面
  性质2:模长|c|=|a||b|sin<a,b>
  性质3:满足右手法则。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们能够使用叉积的正负值来推断向量a,b的相对位置。即向量b是处于向量a的顺时针方向还是逆时针方向。

  依据上面的性质2,我们也相同的能够计算出两个向量的夹角。
  以下是演示样例代码:

using UnityEngine;
using System.Collections;

public class MainScript : MonoBehaviour
{
		//向量a
		private Vector3 a;
		//向量b
		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);
				//向量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);
				//向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
				angle = Mathf.Asin (Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))) * Mathf.Rad2Deg;
				GUILayout.Label ("向量axb为:" + e);
				GUILayout.Label ("向量bxa为:" + d);
				GUILayout.Label ("向量a,b的夹角为:" + angle);
		}
}
  上面的演示样例中,我们定义了两个向量a和b。

分别求出了他们的点积和叉积,并通过点积和叉积来反过来计算他们的夹角。
  这里要说明的是:
  1.a.normalized 和 b.normalized 表示的是两个向量的单位向量, 由于在公式里,有向量和模的除法。得出来的结果就是单位向量,所以我们这里和后面都直接用单位向量来计算,省去不少麻烦。



  2.Mathf.Rad2Deg表示的是 单位弧度的度数。详情请见本人文章: Unity3D之Mathf.Rad2Deg和Mathf.Deg2Rad
  3.通过叉积计算度数是通过公式|c|=|a||b|sin<a,b>来逆向求值。|c| 事实上就是叉积的模,换句话说,也代表着Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值。


  结果图例如以下:

  技术分享

  本文章为个人原创,版权全部,转载请注明出处:http://blog.csdn.net/ml3947,另外我的个人博客:http://www.wjfxgame.com.
























以上是关于Unity3D之Vector3.Dot和Vector3.Cross的使用的主要内容,如果未能解决你的问题,请参考以下文章

判断一个物体在前后左右?

unity 由两个向量求夹角

《Unity3d-控制枪口的朝向代码》

unity3d之简单动画

Unity3D 之UGUI 文本框和编辑框

Unity3D游戏开发之从Unity3D项目版本号控制说起