• unity-点乘和叉乘的应用


    http://blog.csdn.net/oskytonight/article/details/38900087

    点乘:两个向量点乘得到一个标量 ,数值等于两个向量长度相乘后再乘以二者夹角的余弦值 。如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度

    点乘后得到的是一个值

    若结果 == o,则 两向量 互垂直 。
    若结果 < 0  ,则 两向量夹角大于90°。
    若结果 >0  ,则两向量夹角小于 90°。

    叉乘:两 个向量的叉乘得到一个新的向量 ,新向量垂直于原来的两个向量再乘夹角的正弦值 

    叉乘后得到的还是一个向量

    Unity3D里面。两个向量的点乘所得到的是两个向量的余弦值,也就是-1 到1之间,0表示垂直,-1表示相反,1表示相同方向。 两

    个向量的叉乘所得到的是两个向量所组成的面的垂直向量,分两个方向。 简单的说,点乘判断角度,叉乘判断方向。 形象的说当一个

    敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所

    成的角度大小。

    using UnityEngine;

    public class VectorExample : MonoBehaviour
    {

    //点积
    private void TestDot(Vector3 a, Vector3 b)
    {
    // 计算 a、b 点积结果
    float result = Vector3.Dot(a, b);

    // 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]
    float angle = Vector3.Angle(a, b);

    // 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1;
    result = Vector3.Dot(a.normalized, b.normalized);
    // 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)
    float radians = Mathf.Acos(result);
    // 将弧度转换为 角度
    angle = radians * Mathf.Rad2Deg;
    }

    //叉乘
    private void TestCross(Vector3 a, Vector3 b)
    {
    //计算向量 a、b 的叉积,结果为 向量
    Vector3 c = Vector3.Cross(a, b);

    // 通过反正弦函数获取向量 a、b 夹角(默认为弧度)
    float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
    float angle = radians * Mathf.Rad2Deg;

    // 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
    //下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
    // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
    if (c.y > 0)
    {
    // b 在 a 的顺时针方向
    }
    else if (c.y == 0)
    {
    // b 和 a 方向相同(平行)
    }
    else
    {
    // b 在 a 的逆时针方向
    }
    }

    // 获取两个向量的夹角 Vector3.Angle 只能返回 [0, 180] 的值
    // 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
    // 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角
    private void GetAngle(Vector3 a, Vector3 b)
    {
    Vector3 c = Vector3.Cross(a, b);
    float angle = Vector3.Angle(a, b);

    // b 到 a 的夹角
    float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
    float signed_angle = angle * sign;

    Debug.Log("b -> a :" + signed_angle);

    // a 到 b 的夹角
    sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
    signed_angle = angle * sign;

    Debug.Log("a -> b :" + signed_angle);
    }
    }

  • 相关阅读:
    2050编程赛 冰水挑战 HDU 6495
    Codeforces Round #565 (Div. 3) F.Destroy it!
    ADO 查询
    Default parameters (Function) – JavaScript 中文开发手册
    Errors: Deprecated expression closures (Errors) – JavaScript 中文开发手册
    JavaScript RegExp 对象
    在Java中为静态最终变量赋值
    FE_INVALID (Numerics) – C 中文开发手册
    getter-return (Rules) – Eslint 中文开发手册
    no-irregular-whitespace (Rules) – Eslint 中文开发手册
  • 原文地址:https://www.cnblogs.com/alps/p/6240634.html
Copyright © 2020-2023  润新知