206 lines
5.0 KiB
Markdown
206 lines
5.0 KiB
Markdown
|
3D基本变换
|
|||
|
===============
|
|||
|
|
|||
|
## 3D向量(Vector3D) ##
|
|||
|
|
|||
|
该类有x/y/z/w四个成员变量,可用作记录3D坐标/3D向量/四元数。w可用作xyz的缩放分量,或该对象为四元数时候存放第四个数据。
|
|||
|
|
|||
|
* add():加法运算,用当前数据的x/y/z分别加上输入数据的x/y/z,结果存入target中
|
|||
|
* x/y/z三个分量各自相加
|
|||
|
|
|||
|
----------
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 0, 1, 0);
|
|||
|
|
|||
|
var result:egret3d.Vector3D = new egret3d.Vector3D();
|
|||
|
//加法运算后的结果存储在result中。
|
|||
|
vector1.add(vector2, result);
|
|||
|
|
|||
|
//result: (1, 0, 1, 0);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* incrementBy():加法运算,将当前数据的x/y/z分别加上输入数据的x/y/z
|
|||
|
|
|||
|
----------
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 0, 1, 0);
|
|||
|
|
|||
|
|
|||
|
//vector1加上vector2数据
|
|||
|
vector1.incrementBy(vector2);
|
|||
|
|
|||
|
//vector1: (1, 0, 1, 0);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* subtract():减法运算,用当前数据的x/y/z分别减去输入数据的x/y/z,结果存入target中
|
|||
|
|
|||
|
----------
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 0, 1, 0);
|
|||
|
|
|||
|
var result:egret3d.Vector3D = new egret3d.Vector3D();
|
|||
|
//加法运算后的结果存储在result中。
|
|||
|
vector1.subtract(vector2, result);
|
|||
|
|
|||
|
//result: (1, 0, -1, 0);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* decrementBy():减法运算,将当前数据的x/y/z分别减去输入数据的x/y/z
|
|||
|
|
|||
|
----------
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 0, 1, 0);
|
|||
|
|
|||
|
|
|||
|
//vector1减去vector2数据
|
|||
|
vector1.decrementBy(vector2);
|
|||
|
|
|||
|
//vector1: (1, 0, -1, 0);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* crossProduct():叉乘, a·b=|a|·|b|·cos(a,b),(a,b)表示a,b的夹角;
|
|||
|
* 通过叉乘计算可以获得一个垂直于ab所在平面的方向,在a和b为单位向量的情况下,所得结果也为单位向量。
|
|||
|
|
|||
|
|
|||
|
![](crossProduct.jpg)
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 1, 0, 0);
|
|||
|
var result:egret3d.Vector3D = new egret3d.Vector3D();
|
|||
|
|
|||
|
//vector1加上vector2数据
|
|||
|
vector1.crossProduct(result);
|
|||
|
|
|||
|
//result: (0, -1, 0, 1);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* dotProduct():点乘,a*b=ax*bx + ay*by + az*bz;
|
|||
|
* 点积也叫做内积,计算的结果反应出2个向量之间的夹角关系。
|
|||
|
* a和b为单位向量时候,结果为夹角的余弦值。
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 1, 0, 0);
|
|||
|
|
|||
|
//vector1加上vector2数据
|
|||
|
var result:number = vector1.dotProduct(result);
|
|||
|
|
|||
|
//result: 0; (vector1和vector2夹角的余弦值为0)
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
|
|||
|
* negate():取反;
|
|||
|
* 取反操作为x/y/z三轴数据各自乘以-1
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 0);
|
|||
|
//取反操作
|
|||
|
vector1.negate();
|
|||
|
|
|||
|
//vector1: (-1, 0, 0, 0);
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
|
|||
|
* normalize():标准化
|
|||
|
* 在不改变向量方向的条件下,改变向量长度为指定的值
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 2, 3, 0);
|
|||
|
//标准化
|
|||
|
vector1.normalize(1);
|
|||
|
|
|||
|
//w 0 Number
|
|||
|
//x 0.2672612419124244 Number
|
|||
|
//y 0.5345224838248488 Number
|
|||
|
//z 0.8017837257372732 Number
|
|||
|
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
|
|||
|
* slerp():四元数平滑插值
|
|||
|
* 输入一个0-1之间的参数,在四元数a和四元数b的之间平滑插值获得新的向量
|
|||
|
* 可用于骨骼旋转计算的两个关键帧之间插值运算
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 1);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 1, 0, 1);
|
|||
|
//插值
|
|||
|
vector1.slerp(vector1, vector2, 0.2);
|
|||
|
|
|||
|
//w 1 Number
|
|||
|
//x 0.9510565400123596 Number
|
|||
|
//y 0.30901700258255005 Number
|
|||
|
//z 0 Number
|
|||
|
|
|||
|
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
|
|||
|
* lerp():普通线性插值
|
|||
|
* 在向量a和向量b的之间线性插值获得新的向量,x/y/z三轴各自线性插值
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(1, 0, 0, 1);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(0, 1, 0, 1);
|
|||
|
//插值
|
|||
|
vector1.slerp(vector1, vector2, 0.2);
|
|||
|
|
|||
|
//w 1 Number
|
|||
|
//x 0.8 Number
|
|||
|
//y 0.2 Number
|
|||
|
//z 0 Number
|
|||
|
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
* multiply():乘法运算;
|
|||
|
* 将向量a的xyz分量分别乘以向量b的xyz分量,结果存入target中
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(2, 3, 4, 1);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(4, 6, 8, 1);
|
|||
|
var result:egret3d.Vector3D = new egret3d.Vector3D();
|
|||
|
//乘法运算
|
|||
|
vector1.multiply(vector2, result);
|
|||
|
|
|||
|
//result: (8, 18, 32, 1)
|
|||
|
|
|||
|
|
|||
|
---------
|
|||
|
|
|||
|
|
|||
|
* divided():除法运算,将向量a的x/y/z分量分别除以向量b的x/y/z分量,结果存入target中
|
|||
|
|
|||
|
----------
|
|||
|
|
|||
|
var vector1:egret3d.Vector3D = new egret3d.Vector3D(2, 3, 4, 1);
|
|||
|
var vector2:egret3d.Vector3D = new egret3d.Vector3D(4, 6, 8, 1);
|
|||
|
var result:egret3d.Vector3D = new egret3d.Vector3D();
|
|||
|
//乘法运算
|
|||
|
vector1.divided(vector2, result);
|
|||
|
|
|||
|
//result: (0.5, 0.5, 0.5, 1)
|
|||
|
|
|||
|
---------
|