UNPKG

mat4.js

Version:

High-performance 4x4 matrix library with multi-precision support for 3D graphics development

160 lines (119 loc) 5.17 kB
# mat4 高性能4x4矩阵运算库,专为3D图形开发设计,提供多精度版本满足不同场景需求,接口统一且易用。 [![npm version](https://badge.fury.io/js/mat4.svg)](https://badge.fury.io/js/mat4) [![minified size](https://badgen.net/bundlephobia/min/mat4)](https://bundlephobia.com/package/mat4) [![license](https://badgen.net/npm/license/mat4)](https://github.com/yourusername/mat4/blob/main/LICENSE) ## 特性 - **多精度支持**:提供三种实现版本,按需选择 - Float32版本:性能最优,适合大多数3D场景 - Float64版本:高精度计算,适合科学运算 - 普通数组版本:兼容性最佳,支持老旧环境 - **统一接口**:所有版本API完全一致,切换成本为零 - **轻量高效**:核心代码仅3KB,无外部依赖 - **性能优化**:内置内存池减少GC压力,运算速度媲美主流矩阵库 - **类型安全**:完整TypeScript类型定义,开发更可靠 ## 安装 ```bash npm install mat4 ``` ## 快速开始 ```typescript // 导入默认的Float32版本(性能最优) import { create, rotateX, multiply, translate } from 'mat4'; // 创建矩阵 const m = create(); // 应用变换 rotateX(m, m, Math.PI / 4); // 绕X轴旋转45度 translate(m, m, [10, 20, 30]); // 平移变换 // 矩阵乘法 const a = create(); const b = create(); const result = create(); multiply(result, a, b); ``` ## 版本区分 库通过**函数后缀**区分不同精度版本,接口完全一致: | 版本类型 | 特点 | 函数命名 | 类型定义 | |---------|------|---------|---------| | Float32Array | 性能最优,内存高效 | 无后缀(默认) | `mat4`, `vec3` | | Float64Array | 高精度计算 | 带`64`后缀 | `mat464`, `vec364` | | 普通数组 | 兼容性最好 | 带`Array`后缀 | `mat4Array`, `vec3Array` | ### 多版本使用示例 ```typescript import { create, // Float32版本 create64, // Float64版本 createArray, // 普通数组版本 mat4, // Float32类型 mat464, // Float64类型 mat4Array // 数组类型 } from 'mat4'; // Float32版本(默认) const m32: mat4 = create(); // Float64版本(高精度) const m64: mat464 = create64(); // 普通数组版本(兼容性) const mArr: mat4Array = createArray(); ``` ## 核心API ### 矩阵基础操作 | 函数 | 描述 | 简写 | |------|------|------| | `create()` | 创建新矩阵(初始为单位矩阵) | - | | `identity(out: mat4)` | 设置为单位矩阵 | - | | `copy(out: mat4, a: mat4)` | 复制矩阵 | - | | `multiply(out: mat4, a: mat4, b: mat4)` | 矩阵乘法 (out = a × b) | `mul` | | `transpose(out: mat4, a: mat4)` | 矩阵转置 | `trans` | | `invert(out: mat4, a: mat4)` | 矩阵求逆(失败返回null) | - | ### 几何变换 | 函数 | 描述 | 简写 | |------|------|------| | `translate(out: mat4, a: mat4, v: vec3)` | 平移变换 | - | | `scale(out: mat4, a: mat4, v: vec3)` | 缩放变换 | - | | `rotateX(out: mat4, a: mat4, rad: number)` | 绕X轴旋转 | `rotX` | | `rotateY(out: mat4, a: mat4, rad: number)` | 绕Y轴旋转 | `rotY` | | `rotateZ(out: mat4, a: mat4, rad: number)` | 绕Z轴旋转 | `rotZ` | ### 投影矩阵 | 函数 | 描述 | |------|------| | `perspective(out: mat4, fovy: number, aspect: number, near: number, far: number)` | 创建透视投影矩阵 | | `ortho(out: mat4, left: number, right: number, bottom: number, top: number, near: number, far: number)` | 创建正交投影矩阵 | | `lookAt(out: mat4, eye: vec3, center: vec3, up: vec3)` | 创建视图矩阵(相机看向目标) | ### 向量变换 | 函数 | 描述 | |------|------| | `transformPoint(out: vec3, m: mat4, v: vec3)` | 变换3D点(考虑平移) | | `transformVector(out: vec3, m: mat4, v: vec3)` | 变换3D向量(不考虑平移) | ### 批量操作与内存管理 | 函数 | 描述 | 简写 | |------|------|------| | `tempMat4()` | 获取临时矩阵(从内存池) | - | | `tempMat4Bulk(count: number)` | 批量获取临时矩阵 | - | | `multiplyBulk(out: mat4[], a: mat4[], b: mat4[], count: number)` | 批量矩阵乘法 | `mulBulk` | | `resetPoolArray()` | 重置数组版本的内存池 | - | ## 常量 库提供常用数学常量,同样遵循版本后缀规则: ```typescript import { PI, PI64, PIArray } from 'mat4'; // PI常量(不同版本) console.log(PI); // Float32版本的π console.log(PI64); // Float64版本的π console.log(PIArray); // 数组版本的π ``` 可用常量包括:`EPSILON`(极小值)、`PI`(π)、`PI_2`(2π)、`PI_HALF`(π/2## 性能对比 | 操作 | Float32 vs 数组版本 | Float32 vs Float64 | |------|-------------------|-------------------| | 矩阵乘法 | 快3.37倍 | 快12% | | 旋转变换 | 快2.75倍 | 快10% | | 矩阵求逆 | 快3.23倍 | 快15% | | 批量操作 | 快3.43倍 | 快13% | ## 适用场景 - WebGL/Three.js等3D渲染框架辅助计算 - 3D游戏开发中的坐标变换 - 计算机图形学算法实现 - AR/VR应用中的姿态计算 - 需要高精度计算的科学应用 - 兼容性要求高的老旧环境 ## 许可证 MIT