zoukankan      html  css  js  c++  java
  • 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.


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4850943.html
Copyright © 2011-2022 走看看