三维向量
程序员文章站
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();
上一篇: C语言初步学习:分支结构体验(发工资)
下一篇: C++:公有/私有/保护继承等举例说明