# vec4 **Repository Path**: cesiumjs/vec4 ## Basic Information - **Project Name**: vec4 - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-15 - **Last Updated**: 2025-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vec4 **vec4** 是一个高性能的四维向量库,专为 3D 数学和图形计算设计。复制粘贴于 [gl-matrix](https://github.com/toji/gl-matrix)它提供了完整的四维向量操作函数,适用于游戏开发、3D 图形处理、物理模拟等场景。 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/) ## 功能特性 - **完整的向量操作**:支持创建、加减乘除、归一化、插值等常见操作 - **TypeScript 支持**:完全类型安全,提供清晰的类型定义 - **高性能实现**:基于 Float32Array,优化了内存使用和计算性能 - **多环境支持**:支持 ESM、CommonJS 和浏览器环境 - **轻量无依赖**:无多余依赖,体积小巧 ## 安装 通过 npm 安装: ```bash npm install vec4 ``` ## 使用方式 ### ESM (现代浏览器和 Node.js) ```javascript import { create, add, subtract, normalize } from 'vec4'; // 创建向量 const vecA = create(); const vecB = fromValues(1, 2, 3, 4); // 向量运算 const result = create(); add(result, vecA, vecB); subtract(result, vecB, vecA); normalize(result, vecB); ``` ### CommonJS (Node.js) ```javascript const { create, add, scale } = require('vec4'); const vecA = create(); const vecB = fromValues(2, 3, 4, 5); const result = create(); scale(result, vecB, 2.0); ``` ### 浏览器 (通过 script 标签) ```html vec4 Browser Example ``` ## 使用示例 ### 基本向量操作 ```typescript import { create, fromValues, add, subtract, multiply, divide } from 'vec4'; // 创建向量 const vecA = fromValues(1, 2, 3, 4); const vecB = fromValues(2, 3, 4, 5); const result = create(); // 基本运算 add(result, vecA, vecB); // result = vecA + vecB subtract(result, vecA, vecB); // result = vecA - vecB multiply(result, vecA, vecB); // result = vecA * vecB divide(result, vecA, vecB); // result = vecA / vecB ``` ### 向量属性计算 ```typescript import { fromValues, length, squaredLength, distance, dot } from 'vec4'; const vecA = fromValues(1, 2, 3, 4); const vecB = fromValues(2, 3, 4, 5); // 计算长度 const len = length(vecA); const sqrLen = squaredLength(vecA); // 计算距离 const dist = distance(vecA, vecB); // 计算点积 const dotProduct = dot(vecA, vecB); ``` ### 向量变换 ```typescript import { fromValues, normalize, scale, lerp } from 'vec4'; const vec = fromValues(3, 4, 0, 0); // 归一化 const normalized = create(); normalize(normalized, vec); // normalized = [0.6, 0.8, 0, 0] // 缩放 const scaled = create(); scale(scaled, vec, 2); // scaled = [6, 8, 0, 0] // 线性插值 const start = fromValues(0, 0, 0, 0); const end = fromValues(10, 10, 10, 10); const interpolated = create(); lerp(interpolated, start, end, 0.5); // interpolated = [5, 5, 5, 5] ``` ## API 文档 ### 创建和初始化 | 函数名 | 描述 | |--------|------| | [create()](vec4.js#L13-L22) | 创建一个新的空四维向量 `[0, 0, 0, 0]` | | [clone(a)](vec4.js#L30-L37) | 从现有向量克隆一个新的向量 | | [fromValues(x, y, z, w)](vec4.js#L48-L55) | 从给定值创建一个新的向量 | | `set(out, x, y, z, w)` | 设置向量的分量值 | ### 基本运算 | 函数名 | 描述 | |--------|------| | [add(out, a, b)](vec4.js#L98-L104) | 向量加法 `out = a + b` | | [subtract(out, a, b)](vec4.js#L114-L120) | 向量减法 `out = a - b` | | [multiply(out, a, b)](vec4.js#L130-L136) | 向量乘法 `out = a * b` | | [divide(out, a, b)](vec4.js#L146-L152) | 向量除法 `out = a / b` | | [scale(out, a, b)](vec4.js#L239-L245) | 向量缩放 `out = a * b` | | [scaleAndAdd(out, a, b, scale)](vec4.js#L256-L262) | 缩放后加法 `out = a + b * scale` | ### 数学函数 | 函数名 | 描述 | |--------|------| | [ceil(out, a)](vec4.js#L161-L167) | 向上取整 | | [floor(out, a)](vec4.js#L176-L182) | 向下取整 | | [round(out, a)](vec4.js#L223-L229) | 四舍五入 | | [min(out, a, b)](vec4.js#L192-L198) | 取两个向量的最小值 | | [max(out, a, b)](vec4.js#L208-L214) | 取两个向量的最大值 | ### 向量属性 | 函数名 | 描述 | |--------|------| | [length(a)](vec4.js#L300-L306) | 计算向量长度 | | [squaredLength(a)](vec4.js#L314-L320) | 计算向量长度的平方 | | [distance(a, b)](vec4.js#L271-L277) | 计算两个向量之间的距离 | | [squaredDistance(a, b)](vec4.js#L286-L292) | 计算两个向量之间距离的平方 | | [dot(a, b)](vec4.js#L382-L384) | 计算两个向量的点积 | ### 向量操作 | 函数名 | 描述 | |--------|------| | [normalize(out, a)](vec4.js#L359-L373) | 归一化向量 | | [negate(out, a)](vec4.js#L329-L335) | 向量取反 | | [inverse(out, a)](vec4.js#L344-L350) | 向量求倒数 | | [cross(out, u, v, w)](vec4.js#L395-L413) | 计算四维空间中三个向量的叉积 | | [lerp(out, a, b, t)](vec4.js#L424-L434) | 线性插值 | | [random(out, scale?)](vec4.js#L443-L469) | 生成随机向量 | ### 变换函数 | 函数名 | 描述 | |--------|------| | [transformMat4(out, a, m)](vec4.js#L479-L489) | 使用 4x4 矩阵变换向量 | | [transformQuat(out, a, q)](vec4.js#L499-L529) | 使用四元数变换向量 | ### 实用函数 | 函数名 | 描述 | |--------|------| | [zero(out)](vec4.js#L537-L543) | 将向量设置为零向量 | | [copy(out, a)](vec4.js#L64-L70) | 复制向量 | | [exactEquals(a, b)](vec4.js#L562-L564) | 精确比较两个向量是否相等 | | [equals(a, b)](vec4.js#L573-L592) | 近似比较两个向量是否相等 | | [str(a)](vec4.js#L551-L553) | 返回向量的字符串表示 | ### 别名函数 | 别名 | 原函数 | |------|--------| | `sub` | [subtract](vec4.js#L114-L120) | | `mul` | [multiply](vec4.js#L130-L136) | | `div` | [divide](vec4.js#L146-L152) | | `dist` | [distance](vec4.js#L271-L277) | | `sqrDist` | [squaredDistance](vec4.js#L286-L292) | | [len](vec4.js#L364-L364) | [length](vec4.js#L300-L306) | | [sqrLen](index.d.ts#L304-L304) | [squaredLength](vec4.js#L314-L320) | ## 构建与测试 ### 构建项目 1. 克隆仓库: ```bash git clone https://gitee.com/cesiumjs/vec4.git cd vec4 ``` 2. 安装依赖: ```bash npm install ``` 3. 构建库: ```bash npm run build ``` 编译后的文件将位于 `dist` 目录中,包含以下格式: - `index.js` - CommonJS 格式 - `index.mjs` - ES Module 格式 - `index.global.js` - UMD 格式(适用于浏览器) ### 运行测试 ```bash npm test ``` ## 性能特点 1. **基于 Float32Array**:使用 Float32Array 以获得更好的性能和内存效率 2. **零内存分配**:大部分函数通过修改输出向量来避免创建新对象 3. **内联优化**:简单函数可以被 JavaScript 引擎内联优化 4. **缓存友好**:连续内存布局有利于 CPU 缓存 ## 浏览器兼容性 - Chrome 7+ - Firefox 4+ - Safari 5.1+ - Internet Explorer 10+ - Edge 所有版本 ## 贡献指南 欢迎贡献代码!请遵循以下步骤: 1. Fork 本仓库 2. 创建新的分支用于开发功能或修复问题 3. 提交 Pull Request,并附上清晰的描述 确保代码符合现有的风格规范,并包含适当的单元测试。 ## 许可证 本项目采用 [MIT 许可证](LICENSE)。 ```