vislite
Version:
灵活、快速、简单的数据可视化交互式跨端前端库
175 lines (116 loc) • 3 kB
Markdown
# Matrix4 矩阵变换
Matrix4 提供 4x4 矩阵变换能力,用于复杂的图形变换。
## 引入
```js
import { Matrix4 } from 'vislite';
```
## 初始化
```js
var matrix = new Matrix4();
// 或指定初始矩阵
var matrix = new Matrix4([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
```
## 基本变换
### 平移
```js
matrix.move(dis, a, b, c);
```
参数说明:
- **dis**: 移动距离
- **a, b, c**: 移动方向向量的 x, y, z 分量
```js
// 向x轴正方向移动10
matrix.move(10, 1, 0, 0);
// 向y轴负方向移动5
matrix.move(-5, 0, 1, 0);
```
### 旋转
```js
matrix.rotate(deg, a1, b1, c1, a2, b2, c2);
```
参数说明:
- **deg**: 旋转角度(弧度制)
- **a1, b1, c1**: 旋转轴向量(确定旋转平面)
- **a2, b2, c2**: 旋转正方向向量
```js
// 绕x轴旋转
matrix.rotate(Math.PI, 1, 0, 0);
// 绕y轴旋转
matrix.rotate(Math.PI, 0, 1, 0);
// 绕z轴旋转
matrix.rotate(Math.PI, 0, 0, 1);
```
### 缩放
```js
matrix.scale(xTimes, yTimes, zTimes, cx, cy, cz);
```
参数说明:
- **xTimes, yTimes, zTimes**: 各轴缩放比例
- **cx, cy, cz**: 缩放中心点坐标
```js
// 以原点为中心放大2倍
matrix.scale(2, 2, 2);
// 以(10, 10, 0)为中心放大
matrix.scale(2, 2, 1, 10, 10, 0);
```
## 矩阵运算
### 矩阵乘法
```js
matrix.multiply(newMatrix4, flag);
```
- **flag**: false(默认)新矩阵左乘当前矩阵;true 则右乘
### 应用变换
```js
var [x, y, z, w] = matrix.use(px, py, pz, pw);
```
将变换应用到坐标点,返回变换后的齐次坐标。
### 获取矩阵值
```js
var values = matrix.value();
```
返回 4x4 矩阵的 16 个元素数组(列主序存储)。
### 重置矩阵
```js
matrix.setValue([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
```
## 使用示例
### 组合变换
```js
var matrix = new Matrix4();
// 先平移再旋转
matrix.move(100, 1, 0, 0);
matrix.rotate(Math.PI / 4, 0, 0, 1);
// 应用到点
var [x, y] = matrix.use(10, 20, 0);
```
### 3D 变换
```js
var matrix = new Matrix4();
// 绕x轴旋转45度
matrix.rotate(Math.PI / 4, 1, 0, 0);
// 绕y轴旋转30度
matrix.rotate(Math.PI / 6, 0, 1, 0);
// 应用到3D点
var [x, y, z, w] = matrix.use(10, 20, 30);
```
---
## 基础变换函数
除 Matrix4 类外,还提供独立的基础变换函数:
### rotate 旋转
```js
import { rotate } from 'vislite';
var [x, y] = rotate(cx, cy, deg, px, py);
```
绕点 (cx, cy) 旋转 deg 弧度后的 (px, py) 坐标。
### move 平移
```js
import { move } from 'vislite';
var [x, y, z] = move(dis, a, b, c, px, py, pz);
```
沿向量 (a, b, c) 方向移动 dis 距离后的坐标。
### scale 缩放
```js
import { scale } from 'vislite';
var [x, y, z] = scale(times, cx, cy, cz, px, py, pz);
```
以 (cx, cy, cz) 为中心缩放 times 倍后的坐标。