unity3d math 常用的数学

来源:互联网 发布:php 整数保留2位小数 编辑:程序博客网 时间:2024/06/04 18:19

1.计算游戏中敌人被击退的方向:类似

   Vector3 lhs = (Vector3) (this.parentChara.MoveDirection * this.parentChara.MoveSpeed);
            Vector3 rhs = component.parentChara.myTransform.position - this.parentChara.myTransform.position;
            rhs.y = 0f;
            float num = Vector3.Dot(lhs, rhs);
            if (num > 0f)
            {
                component.parentChara.PushVelocity += (Vector3) ((rhs.normalized * num) * 0.5f);
            }

2.Vector.dot

Vector3.Dot也叫点积,它返回1个-1.0~1.0之间的一个值。网上确实也这么说。但是这个值表示什么呢?恩,表示返回进行Dot计算的两个向量之间的夹角余弦值(Cos弧度角).要注意的是能进行Dot计算的前提是两个向量首先要变成单位向量!

public class DotTest : MonoBehaviour {

 

public Vector3 v1;

public Vector3 v2;

public float dot;

public float cos;

// Use this for initialization

void Start () {

v1 = new Vector3(2,2,0);

v2 = new Vector3(100);

}

 

// Update is called once per frame

void Update () {

 

dot = Vector3.Dot(v1.normalized, v2.normalized);

cos = Mathf.Cos(Mathf.PI/4);

 

}

}


一、点积(又称“数量积”、“内积”)

    1、理论知识

   在数学中,点积的定义为a·b=|a|·|b|cos<a,b> 【注:粗体小写字母表示向量,<a,b>表示向量a,b的夹角,取值范围为[0,π]】。从定义上,我们知道向量的点积得到的是一个数值。而不是向量(这点大家要注意了!要与叉积进行区别)。另外点积中的夹角<a,b>没有顺序可言,即<a,b>=<b,a>(或a·b=b·a)。所以我们可以通过点积得到两个向量之间的夹角。<a,b>= arccos(a·b / (|a|·|b|))。并且通过点积的正负值,我们可以判断两个向量的方向关系。如果为正,即>0,他们夹角为(0,π/2)。如果为负,夹角为(π/2,π)。

   2、Unity3D中应用

  在Unity中,点积表示为Vector3.Dot(Vector3,Vector3):float——参数为2个向量,返回值为浮点型。





























using UnityEngine;
using System.Collections;
 
public class Vector3_Dot : MonoBehaviour {
     
    //向量a
    Vector3 a;
    //向量b
    Vector3 b;
     
    void Start()
    {
        //向量的初始化
        a =newVector3(3, 0, 0);//x轴方向,长度为3
        b =newVector3(Mathf.Sqrt(2), Mathf.Sqrt(2), 0);//(根号2,根号2,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);
    }
     
}

a.normalized表示该方向的单位向量,即方向与向量a相同,长度为1的向量。Mathf.Acos()即数学中的arccos()函数。Mathf.Rad2Deg表示将弧度转化为角度。

结果如下图:


二、叉积(又称“向量积”、“外积”)

   1、理论知识

   数学上的定义:c=axb【注:粗体小写字母表示向量】其中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、Unity中应用

   在Unity中,叉积表示为Vector3.Cross(Vector3,Vector3):Vector3——参数为2个向量,返回值也为向量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using UnityEngine;
using System.Collections;
 
public class Vector3_Cross : MonoBehaviour {
 
    //向量a
    Vector3 a;
    //向量b
    Vector3 b;
 
    void Start()
    {
        //向量的初始化
        a = newVector3(3, 0, 0);//x轴方向,长度为3
        b = newVector3(0, 4, 0);//y轴方向,长度为4
    }
 
    void OnGUI()
    {
        //叉积的返回值
        Vector3 c = Vector3.Cross(a, b);
        Vector3 d = Vector3.Cross(b, a);
        //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        float angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;
        GUILayout.Label("向量axb为:"+ c);
        GUILayout.Label("向量bxa为:"+ d);
        GUILayout.Label("向量a,b的夹角为:"+ angle);
    }
}

Vector3.Distance()用于计算2个Vector3的距离,在这里我们可以得到叉积向量的模长。

结果如下图:



0 0
原创粉丝点击