欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三维向量

程序员文章站 2022-03-26 17:49:46
...

1)笔记

1)三维向量Vec3的使用:
  (1)Vec3: cocos定义的一个三维向量的类,在cc模块中;

  (2)向量在每个坐标轴的分量: x、y、z:

  (3)构造一个向量的3种方式:
      new Vec3(v: Vec3):  new了一个Vec3的实例出来,然后我们的实例里面的x,y,z-->v的分量一样;
      new Vec3(x,y,z): new Vec3的实例,实例xyz分别是这个参数;
      cc模块也为我们定义了一个函数: cc.v3(x,y,z)

      xyz是可选的,可以全都不填
  
  (4)Vec3定义了一些常用的 `静态常量`(只用就行,不要修改他们)
     UINT_X: Readonly (1,0,0)
     UINT_Y: Readonly (0,1,0)
     UINT_Z: Readonly (0,0,1)
     ZERO: (0,0,0)
     ONE: Readonly (1,1,1)
     NEG_ONE: Readonly (-1,-1,-1)

  (5)常用向量的 `静态方法`
    向量长度:  开根号(x*x + y*y + z*z)
    	Vec3.len() -->静态方法求
        v4.length-->直接通过方法搞


    加减法:
       加法:
         v4.add(xxx)
         Vec3.add(xx, xx, xx)-->不改变向量结果,存储到另外一个变量

       减法:
          v4.subtract(xx)
          Vec3.subtract(v3, xx, xx)-->不改变向量结果,存储到另外一个变量

    
       加减法的本质: 三角形法则   四边形法则   c = a+b b = c-a
   
       应用: 相对于坐标原点,由从A点运动到B点, A到B的方向 向量怎么求呢? dir=B-A即可得到这个方向向量


    2个向量点的距离: 
      (x1,y1,z1)  (x2,y2,z2)  --> (x2-x1平方 + y2-y1的平方 + z2-z1的平方)-->开平方

      Vec3.distance(v4, v3)

    2个点之间: 向量的线性插值:
      (x1,y1,z1), (x2,y2,z2) --> 从A到B的点-->[0,1]这个范围-->A = A1 + t*(A2-A1)

      这个结果变为:修改自己的向量,因为返回的是this

      Vec3.lerp(v3, v1, v4, 0.3): v3 = v1 + 0.3 * (v4-v1)

      v1.lerp(v4, 0.3)-->修改到自己v1上

    向量的点乘(得到一个数值,不是向量):
    	理论:
    	  A(x1,y1,z1)  B(x2,y2,z2)-->A*B = x1*x2 + y1*y2+ z1*z2

    	  A*B = |A| * |B| * cos(夹角)-->得到了2个向量的余弦值出来
    	    夹角:2个向量之间,较小的哪个角度[0, 180]

    	cocos中计算:
    	  静态方法: Vec3.dot(v1, v4)-->是一个number数值  



    向量的叉积(返回的是一个向量):
      理论:
        AXB = (y1*z2-y2*z1, -(x1*z2 - x2*z1), x1*y2-x*2y1)

      叉积的几何意义:AB 2个向量 和 原点构成平面的法向量
        垂直向上: AXB
        垂直向下: BXA

      cocos计算: 
        Vec3.cross(v3,v1,v4)-->v3 = v1Xv4
        v1.cross(v4)-->让v1被修改了  v1 = v1 * v4


    向量的单位化(单位向量: 方向相同,长度为1):
      理论:
        方向相同的向量有N多个
        特点:同一个方向的,成比例 x1/x2 = y1/y2 = z1/z2 = len1/len2

      cocos中计算:
        Vec3.normalize(v3, v4)  v3 = v4的单位向量
        v4.normalize()


  (6)将一个标量分解到对应的向量上
    已知方向向量dir, 速度为100,距离为100-->dir这个方向上;

    x/x_new = len / 100   --> x_new = 100 * x / len-->dir为1, x_new = speed * x;

    含义与运用: 已知一个物体的速度大小和方向,沿着这个方向走-->沿着x走这个多,沿着y走这么多(同时修改x和y即可);

    其实就是初中物理的: 运动的分解; 高中物理叫做:正交分解

    之所以能分解,那么就是根据这个等式计算得到的;

 

let v: Vec3 = cc.v3(3, 4, 5);
        let v1 = new Vec3(0, 0, 0);
        let v3 = new Vec3(v);

        console.log(Vec3.UNIT_X, Vec3.UNIT_Y, Vec3.UNIT_Z, Vec3.ZERO, Vec3.ONE, Vec3.NEG_ONE);

        let v4 = new Vec3(Vec3.UNIT_X);
        console.log(v4);

        console.log(Vec3.len(v4));
        console.log(v4.length());

        v4.add(Vec3.UNIT_Y);
        Vec3.add(v3, Vec3.ONE, Vec3.NEG_ONE);
        console.log(v3);

        v4.subtract(Vec3.UNIT_X);

        let len: number = Vec3.distance(v4, v3);

        Vec3.lerp(v3, v1, v4, 0.3);

        Vec3.dot(v1, v4);

        v1.cross(v4);

        v4.normalize();