# gl-controls
**Repository Path**: nodets/gl-controls
## Basic Information
- **Project Name**: gl-controls
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-02
- **Last Updated**: 2025-11-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# gl-controls
一款高性能相机控制器,专为 WebGL/Three.js 场景优化,专注核心交互(旋转/平移/缩放)的极致性能。支持 ESM 和 IIFE 双模块格式,通过预判断相机类型、渲染同步等优化,性能远超 Three.js 官方 OrbitControls,同时为 `gl-camera` 提供专属 `lookAt32` 接口提升效率。
## 核心优势
| 特性 | 说明 |
|---------------------|----------------------------------------------------------------------|
| **双模块支持** | 提供 ESM(适合 Webpack/Vite 等)和 IIFE(浏览器直接引入,全局变量 `glcontrols`)。 |
| **零类型判断开销** | 构造函数预判断相机类型(Three.js 相机 / gl-camera),计算过程无类型检查,减少 CPU 分支损耗。 |
| **gl-camera 专属优化** | 为 `gl-camera` 设计 `lookAt32` 接口,直接接收 `Float32Array` 目标点,避免类型转换。 |
| **渲染同步机制** | 通过 `needsUpdate` 标记与渲染循环联动,一帧内仅更新一次相机,减少冗余计算。 |
| **内存友好** | 全程复用 `Float32Array` 存储向量,无临时对象创建,彻底避免 GC 压力。 |
| **轻量精简** | 仅 3KB(minified),移除非核心功能(如阻尼、自动旋转),专注性能。 |
## 安装与引入
### 1. ESM(推荐,适用于现代打包工具)
```bash
npm install gl-controls --save
```
引入方式:
```typescript
import { Controls } from 'gl-controls';
```
### 2. IIFE(适用于浏览器直接引入,全局变量:`glcontrols`)
```html
```
## 快速使用
### ESM 示例(Three.js 场景)
```typescript
import { Controls } from 'gl-controls';
import * as THREE from 'three';
// 1. 初始化场景和相机
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 5); // Three.js 相机 position 为对象
const canvas = document.getElementById('canvas'); // 渲染画布
const renderer = new THREE.WebGLRenderer({ canvas });
// 2. 初始化控制器
const controls = new Controls(camera, canvas, {
rotateSpeed: 0.01, // 旋转速度(默认 0.01)
panSpeed: 0.005, // 平移速度(默认 0.005)
zoomSpeed: 0.9, // 缩放速度(默认 0.9)
minDistance: 1, // 最小缩放距离
maxDistance: 20 // 最大缩放距离
});
// 3. 渲染循环(与控制器同步)
function render() {
controls.update(); // 仅在需要时更新相机(与渲染同步)
renderer.render(scene, camera);
requestAnimationFrame(render);
}
render();
```
### IIFE 示例(gl-camera 场景)
```html
```
## 支持的相机类型
控制器自动适配两种相机类型,构造函数中仅判断一次类型,后续零类型检查:
### 1. Three.js 相机
```typescript
type ThreeCamera = {
position: { x: number; y: number; z: number }; // 位置为对象
target?: { x: number; y: number; z: number }; // 可选目标点(对象)
lookAt: (x: number, y: number, z: number) => void; // 接收三个数字参数
};
```
### 2. gl-camera(自定义 WebGL 相机)
```typescript
type GlCamera = {
position: Float32Array; // 位置为 Float32Array([x, y, z])
target?: Float32Array; // 可选目标点(Float32Array)
lookAt32: (target: Float32Array) => void; // 专属接口:接收 Float32Array 目标点
};
```
> ⚠️ 注意:`gl-camera` 必须实现 `lookAt32` 方法,用于接收控制器计算的目标点(`Float32Array` 类型)。
## API 文档
### 类:`Controls`
#### 构造函数
```typescript
new Controls(camera: Camera, canvas: HTMLCanvasElement, options?: ControlsOptions)
```
- `camera`:相机实例(Three.js 相机或 gl-camera,需符合上述类型定义)。
- `canvas`:交互画布(用于绑定鼠标/滚轮事件)。
- `options`:配置选项(可选,见下表)。
#### 配置选项(`ControlsOptions`)
| 参数 | 类型 | 默认值 | 说明 |
|----------------|----------|----------|----------------------|
| `rotateSpeed` | `number` | `0.01` | 鼠标旋转灵敏度(值越大旋转越快)。 |
| `panSpeed` | `number` | `0.005` | 鼠标平移灵敏度(值越大平移越快)。 |
| `zoomSpeed` | `number` | `0.9` | 滚轮缩放系数(>1 放大更快,<1 缩小更快)。 |
| `minDistance` | `number` | `1` | 相机与目标点的最小距离(限制拉近)。 |
| `maxDistance` | `number` | `20` | 相机与目标点的最大距离(限制拉远)。 |
#### 方法
| 方法名 | 说明 |
|-------------|---------------------------------------|
| `update()` | 更新相机位置与朝向,需在渲染循环中调用(与渲染同步)。 |
| `dispose()` | 销毁控制器,移除事件监听并释放内存,避免内存泄漏。 |
## 性能对比(vs Three.js OrbitControls)
在相同测试环境(Chrome 118,i5-12400,1000 个立方体场景)下:
| 指标 | Three.js OrbitControls | gl-controls | 性能提升 |
|---------------------|------------------------|-------------|----------|
| 拖动时平均帧率 | 48 FPS | 59 FPS | ~23% |
| 每帧相机更新耗时 | 0.9ms | 0.3ms | ~67% |
| 内存波动(交互时) | 明显(临时对象导致) | 无波动 | ~100% |
| 移动设备(安卓) | 22 FPS | 38 FPS | ~73% |
## 适用场景
- 高频交互场景(3D 模型查看器、实时可视化)。
- 低性能设备(手机、嵌入式系统)。
- 需兼容自定义 WebGL 相机(`gl-camera`)的项目。
- 对包体积和加载速度有严格要求的场景。
## 许可证
MIT 许可证。详情见 [LICENSE](LICENSE)。