美文网首页
三维向量点乘 叉乘原理和游戏应用

三维向量点乘 叉乘原理和游戏应用

作者: aaa000 | 来源:发表于2021-09-25 17:21 被阅读0次

    A表示向量 a表示线段长度


    image.png

    //向量计算公式
    A = (x,y,z);
    B = (i,j,k);

    A · B = x * i + y * j + z * k;(数学计算方式)

    图中可以看出 C向量计算方式如下:
    C = A -B;
    同时平方展开
    |C|^2 = |A|^2 + |B|^2 - 2A·B;
    c^2 = a^2 + b^2 - 2A·B;

    图中通过三角形余弦定理:可以获取到
    c^2 = a^2 + b^2 - 2 |a| |b| cosθ

    上面两个方程 联合使用可以得到

    A·B = |a| |b| cosθ
    θ = arccos(A·B/|a| |b|)
    应用场景: 敌人和玩家 两三维个点 计算敌人需要旋转多少度可以面向敌人 (缺点:计算出来的角度小于180°.因为两个向量的夹角不会超过180°,如果顺时针超过180° 就会从逆时针方向计算角度)

    二维向量叉乘的定义

    A = (x,y)
    B = (m,n)
    A x B = 2x2的行列式 = x *n - y * m;

    三维向量叉乘定义 i j k 分别代表笛卡尔坐标系中的 x y z 轴的单位向量

    A = (a1,a2,a3)
    B = (b1,b2,b3);


    image.png

    展开获得:
    C = AxB = (a2 * b3 - a3 * b2,a1 * b3 - a3 * b1,a1 * b2 - a2 * b1);
    可以看出两个向量叉乘后得到的是一个C向量 (使用左手定则快速判断C向量的方向)

    几何意义:如下


    image.png

    C的模长 = A模长 * B模长 * sinθ ;
    (通过这个公式 也可以计算两个向量的家度缺点这个角度小于等于90度)

    游戏中的应用场景:

    1.解决向量点乘无法计算超过180°的问题

            Vector3 pos1 = new Vector3(10, 20, 30);
            Vector3 pos2 = new Vector3(50, 10, 5);
            //计算两个向量之间的角度
            //计算公式 cosθ = A·B/a*b  这里将他们转化成单位向量 a = b = 1 就不用除了
            float cosθ = Vector3.Dot(pos1.normalized, pos2.normalized);
            //反三角函数获取到弧度
            float θ = Mathf.Acos(cosθ);
            //将弧度转化成角度
            float angle = θ * Mathf.Rad2Deg;
            
            //计算两个三维向量的叉乘
            Vector3 pos3 = Vector3.Cross(pos1, pos2);
            //小于零说明 叉乘结果向量向下 pos1->pos2的顺时针角度大于180度
            if (pos3.y<0) 
            {
                //获得大于180°的角
                angle = 360 - angle;
            }
    

    2.获取一个向量垂直已知的两个向量
    3.判断两个向量的顺逆时针关系

    相关文章

      网友评论

          本文标题:三维向量点乘 叉乘原理和游戏应用

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