美文网首页
Unity点乘和叉乘的应用

Unity点乘和叉乘的应用

作者: 86a262e62b0b | 来源:发表于2019-11-01 19:33 被阅读0次

一. 点乘

1. 公式:

  • a · b = v1( x1, y1,z1) * v2(x2, y2,z2) = x1x2 + y1y2+z1*z2;
  • a · b = |a||b|Cos(θ) ( θ[0,180] )

2. 作用:

  • 如果有一个为单位向量,即可算出投影
  • 如果都为单位向量,可以算出夹角
  • 求出夹角后,可以根据大小判断是否位于一个物体的前面或后面
  • shader灯光

二. 叉乘

1. 公式:

  • a x b = v1( x1, y1, z1) * v2(x2, y2, z2) = (y1z2 - y2z1) i + (x2z1 - x1z2) j + (x1y2-x2y1) k
  • c = a x b 、 a x b = -b x a 、θ[0,180] 、 模长|c| = |a||b| sin<a,b>

2. 作用:

  • 物体在另外一个物体的左侧还是右侧
  • | A*B | 等于A和B组成的平行四边形的面积。
  • shader灯光

三. 代码

1. 核心代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/**
 参考:https://blog.csdn.net/bobo553443/article/details/79615454
 点乘:
    v1( x1, y1,z1) * v2(x2, y2,z2) = x1*x2 + y1*y2+z1*z2;
    a · b = |a||b|Cos(θ)             θ[0,180]

 叉乘:
    v1( x1, y1,z1) * v2(x2, y2, z2) = (y1*z2 - y2*z1)i + (x2*z1 - x1*z2)j + (x1*y2-x2*y1)k
    c = a x b  、 a x b = -b x a  、θ[0,180]  、 模长|c| = |a||b| sin<a,b>
    */
public class RelativePosition
{
    #region 两个基本方法
    //得到两向量在空间中的角度[0,180],不含方向。
    public static float GetAngle_Base(Vector3 VectorA, Vector3 VectorB)
    {
        /**
            点乘:a · b = |a||b|Cos(θ)    θ[0,180]
            将两个向量当作单位向量
            得到弧度,然后转换为角度
         */
        return Mathf.Acos(Vector3.Dot(VectorA.normalized, VectorB.normalized)) * Mathf.Rad2Deg;
    }

    /* c = a * b  
     * a * b = -b * a  
     * |c| = |a||b| sin<a,b>
     * θ[0,180]
     */
    //注意,在数学中为右手法则,在unity中为左手法则
    //此处,无论以哪个平面为参考,只要y轴方向值为正,那么B就在A的右边
    public static bool BIsOnARight_Base(Vector3 A, Vector3 B)
    {
        //叉乘:
        Vector3 c = Vector3.Cross(A, B);
        if (c.y > 0)        //B在A右边
        {
            return true;
        }
        else if (c.y > 0)   //B在A左边
        {
            return false;
        }
        else                //c.y == 0 , AB方向相同
        {
            return false;
        }
    }
    #endregion

    #region 扩展
    /// <summary>
    /// 1. A点的forward与到B点的向量,在空间中的角度[0,180],不含方向
    /// 2. 通过返回的角度也可以判断B点是否在A点的前面或后面
    /// </summary>
    /// <param name="A">A点</param>
    /// <param name="B">B点</param>
    /// <returns></returns>
    public static float GetAngle(Transform A, Transform B)
    {
        return GetAngle_Base(A.forward,B.position - A.position);
    }

    /// <summary>
    /// B点是否在A点的右边?
    /// </summary>
    /// <param name="A">A点</param>
    /// <param name="B">B点</param>
    /// <returns></returns>
    public static bool BIsOnARight(Transform A, Transform B)
    {
        return BIsOnARight_Base(A.forward, B.position - A.position);
    }
    #endregion
}

2.调用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestPosition : MonoBehaviour
{
    public Transform A;
    public Transform B;

    private void Update()
    {
        Debug.Log(RelativePosition.BIsOnARight(A, B));
        Debug.Log(RelativePosition.GetAngle(A, B));
    }
}

相关文章

  • Unity点乘和叉乘的应用

    一. 点乘 1. 公式: a · b = v1( x1, y1,z1) * v2(x2, y2,z2) = x1x...

  • Unity_点乘&叉乘

    点乘 (又称"点积","数量积”,"内积")(Dot Product, 用*)定义:a·b=|a|·|b|cos ...

  • unity-向量的点乘和叉乘

    点乘 点乘的结果,是个数字。(x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2其几何意义为:...

  • Unity 点乘和叉乘的原理和使用

    Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最...

  • 点成叉乘 Unity

    在Unity3D中,Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积。 ...

  • 点乘/叉乘

    一 基本概念 1: 点乘,也叫向量内积、数量积。几何定义:a·b = |a||b|cosθ 2:叉乘,又称向量的外...

  • 向量的点乘与叉乘应用

    先阐述一下向量的概念和公式,再结合例子去验证这些公式1、向量的模:向量的大小就是向量各分量平方和的平方根。 向量...

  • 点乘与叉乘

    public static Vector3 Cross(Vector3 lhs, Vector3 rhs);叉乘的...

  • 三维向量 API

    //静态变量 //向量点乘、 叉乘参考 三维向量点乘叉乘原理[https://www.jianshu.com/p/...

  • 点乘、叉乘的作用

    点乘判断角度叉乘获得方向

网友评论

      本文标题:Unity点乘和叉乘的应用

      本文链接:https://www.haomeiwen.com/subject/nexyyctx.html