three-player-controller 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -58
- package/dist/index.d.mts +124 -13
- package/dist/index.d.ts +124 -13
- package/dist/index.js +1964 -381
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1964 -381
- package/dist/index.mjs.map +1 -1
- package/package.json +17 -8
package/README.md
CHANGED
|
@@ -4,21 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
[![NPM Package][npm]][npm-url]
|
|
6
6
|
|
|
7
|
-
轻量的第三人称 / 第一人称玩家控制器,开箱即用,基于 three.js 和 three-mesh-bvh 实现人物胶囊体碰撞、BVH
|
|
8
|
-
|
|
9
|
-
# 安装
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install three-player-controller
|
|
13
|
-
```
|
|
7
|
+
轻量的第三人称 / 第一人称玩家控制器,开箱即用,基于 three.js 和 three-mesh-bvh 实现人物胶囊体碰撞、BVH 碰撞检测、人物动画、第一/三人称切换与相机避障,利用 three-mesh-bvh 优化碰撞检测性能,大场景下高性能运行。
|
|
14
8
|
|
|
15
9
|
# 示例
|
|
16
10
|
|
|
17
|
-
- [
|
|
18
|
-
|
|
19
|
-
- [3dtiles 场景](https://hh-hang.github.io/three-player-controller/3dtilesScene.html)
|
|
20
|
-
|
|
21
|
-
- [3dtiles 自定义](https://hh-hang.github.io/three-player-controller/3dtilesCustomize.html)
|
|
11
|
+
- [示例](https://hh-hang.github.io/three-player-controller/index.html)
|
|
22
12
|
|
|
23
13
|
### 普通控制
|
|
24
14
|
|
|
@@ -28,10 +18,49 @@ npm install three-player-controller
|
|
|
28
18
|
|
|
29
19
|

|
|
30
20
|
|
|
21
|
+
### 车辆控制
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
31
25
|
### 移动端控制演示
|
|
32
26
|
|
|
33
27
|

|
|
34
28
|
|
|
29
|
+
# 安装
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install three-player-controller three three-mesh-bvh
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 可选依赖
|
|
36
|
+
|
|
37
|
+
如果需要使用**车辆控制**,请安装 Rapier:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install @dimforge/rapier3d-compat
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
如果需要使用**移动端控制**,请安装 nipplejs:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install nipplejs
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
# 本地运行示例
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 克隆仓库
|
|
53
|
+
git clone https://github.com/hh-hang/three-player-controller.git
|
|
54
|
+
|
|
55
|
+
# 安装依赖
|
|
56
|
+
npm install
|
|
57
|
+
|
|
58
|
+
# 运行开发服务器
|
|
59
|
+
npm run dev
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
在浏览器访问 `http://localhost:5173/three-player-controller/` 查看示例。
|
|
63
|
+
|
|
35
64
|
# 使用
|
|
36
65
|
|
|
37
66
|
```js
|
|
@@ -41,19 +70,39 @@ import { playerController } from "three-player-controller";
|
|
|
41
70
|
const player = playerController();
|
|
42
71
|
|
|
43
72
|
// 初始化玩家控制器
|
|
44
|
-
player.init({
|
|
73
|
+
await player.init({
|
|
45
74
|
scene, // three.js 场景
|
|
46
75
|
camera, // three.js 相机
|
|
47
76
|
controls, // three.js 控制器
|
|
48
77
|
playerModel: {
|
|
49
78
|
url: "./glb/person.glb", // 模型路径
|
|
50
|
-
scale: 0.001,
|
|
51
|
-
idleAnim: "
|
|
52
|
-
walkAnim: "
|
|
53
|
-
runAnim: "
|
|
54
|
-
jumpAnim: "
|
|
79
|
+
scale: 0.001, // 模型缩放
|
|
80
|
+
idleAnim: "idle", // Idle 动画名
|
|
81
|
+
walkAnim: "walk", // Walk 动画名
|
|
82
|
+
runAnim: "run", // Run 动画名
|
|
83
|
+
jumpAnim: "jump", // Jump 动画名
|
|
55
84
|
},
|
|
56
|
-
initPos:
|
|
85
|
+
initPos: new THREE.Vector3(0, 0, 0), // 初始位置
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// 加入车辆控制
|
|
89
|
+
await player.loadVehicleModel({
|
|
90
|
+
url: "./glb/bugatti.glb",
|
|
91
|
+
scale: 0.1,
|
|
92
|
+
position: new Vector3(22, 3.69, 14.5),
|
|
93
|
+
wheelsNames: [
|
|
94
|
+
"Wheel_LF", // 前左
|
|
95
|
+
"Wheel_RF", // 前右
|
|
96
|
+
"Wheel_LR", // 后左
|
|
97
|
+
"Wheel_RR", // 后右
|
|
98
|
+
],
|
|
99
|
+
animations: {
|
|
100
|
+
openDoorAnim: "openDoorLF",
|
|
101
|
+
},
|
|
102
|
+
boardingPoint: new Vector3(0.5, 0, 1.8),
|
|
103
|
+
seatOffset: new Vector3(0, 0.6, 0),
|
|
104
|
+
chassisRatio: 0.15,
|
|
105
|
+
suspensionRestLengthRatio: 0.2,
|
|
57
106
|
});
|
|
58
107
|
|
|
59
108
|
// 渲染循环调用
|
|
@@ -68,29 +117,77 @@ player.update();
|
|
|
68
117
|
|
|
69
118
|
```ts
|
|
70
119
|
export function playerController(): {
|
|
120
|
+
// 初始化
|
|
71
121
|
init: (opts: PlayerControllerOptions, callback?: () => void) => void;
|
|
122
|
+
// 加载车辆模型
|
|
123
|
+
loadVehicleModel: (params: VehicleOptions) => void;
|
|
124
|
+
// 切换人物模型
|
|
125
|
+
switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => void;
|
|
126
|
+
// 切换第一/第三人称
|
|
72
127
|
changeView: () => void;
|
|
128
|
+
// 复位玩家位置
|
|
73
129
|
reset: (pos?: THREE.Vector3) => void;
|
|
130
|
+
// 每帧调用
|
|
74
131
|
update: (dt?: number) => void;
|
|
132
|
+
// 销毁控制器
|
|
75
133
|
destroy: () => void;
|
|
76
|
-
|
|
134
|
+
// 外部输入控制
|
|
135
|
+
setInput: (input: PlayerInput) => void;
|
|
136
|
+
// 获取人物当前位置
|
|
137
|
+
getPosition: () => THREE.Vector3;
|
|
138
|
+
// 获取屏幕中心射线与场景的交点
|
|
139
|
+
getCenterScreenRaycastHit: () => THREE.Intersection | undefined;
|
|
140
|
+
// 获取人物模型
|
|
141
|
+
getPerson: () => THREE.Object3D | null;
|
|
142
|
+
// 获取当前驾驶的车辆实例
|
|
143
|
+
getActiveVehicle: () => VehicleInstance | null;
|
|
144
|
+
// 获取所有车辆实例
|
|
145
|
+
getAllVehicles: () => VehicleInstance[];
|
|
146
|
+
// 动态参数调整
|
|
147
|
+
setMouseSensitivity: (mouseSensity: number) => void;
|
|
148
|
+
setGravity: (gravity: number) => void;
|
|
149
|
+
setJumpHeight: (jumpHeight: number) => void;
|
|
150
|
+
setPlayerSpeed: (playerSpeed: number) => void;
|
|
151
|
+
setPlayerFlySpeed: (playerFlySpeed: number) => void;
|
|
152
|
+
setMinCamDistance: (minCamDistance: number) => void;
|
|
153
|
+
setMaxCamDistance: (maxCamDistance: number) => void;
|
|
154
|
+
setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
|
|
155
|
+
setEnableZoom: (enableZoom: boolean) => void;
|
|
156
|
+
setOverShoulderView: (enable: boolean) => void;
|
|
157
|
+
setPlayerScale: (scale: number) => void;
|
|
158
|
+
setDebug: (debug: boolean) => void;
|
|
77
159
|
};
|
|
78
160
|
```
|
|
79
161
|
|
|
80
162
|
### 方法说明
|
|
81
163
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
164
|
+
| 方法 | 说明 |
|
|
165
|
+
|------|------|
|
|
166
|
+
| `init(opts, callback?)` | 初始化控制器,`callback` 在资源加载完成后调用 |
|
|
167
|
+
| `loadVehicleModel(params)` | 加载并初始化一辆车辆,可多次调用加载多辆 |
|
|
168
|
+
| `switchPlayerModel(model)` | 运行时切换人物模型,保留当前位置与朝向 |
|
|
169
|
+
| `changeView()` | 在第一/第三人称间切换 |
|
|
170
|
+
| `reset(pos?)` | 复位玩家到指定位置(默认初始位置) |
|
|
171
|
+
| `update(dt?)` | 每帧调用,驱动物理与动画 |
|
|
172
|
+
| `destroy()` | 销毁控制器,释放所有资源 |
|
|
173
|
+
| `setInput(input)` | 外部传入输入状态,适用于自定义按键或手柄接入 |
|
|
174
|
+
| `getPosition()` | 获取人物当前世界坐标 |
|
|
175
|
+
| `getCenterScreenRaycastHit()` | 获取屏幕中心射线与碰撞体的交点,可用于瞄准/交互检测 |
|
|
176
|
+
| `getPerson()` | 获取人物模型对象 |
|
|
177
|
+
| `getActiveVehicle()` | 获取当前正在驾驶的车辆实例 |
|
|
178
|
+
| `getAllVehicles()` | 获取所有已加载的车辆实例数组 |
|
|
179
|
+
| `setMouseSensitivity(v)` | 设置鼠标灵敏度 |
|
|
180
|
+
| `setGravity(v)` | 设置重力(传入基准值,内部自动乘以 scale) |
|
|
181
|
+
| `setJumpHeight(v)` | 设置跳跃高度(传入基准值,内部自动乘以 scale) |
|
|
182
|
+
| `setPlayerSpeed(v)` | 设置移动速度(传入基准值,内部自动乘以 scale) |
|
|
183
|
+
| `setPlayerFlySpeed(v)` | 设置飞行速度(传入基准值,内部自动乘以 scale) |
|
|
184
|
+
| `setMinCamDistance(v)` | 设置第三人称最小相机距离 |
|
|
185
|
+
| `setMaxCamDistance(v)` | 设置第三人称最大相机距离 |
|
|
186
|
+
| `setThirdMouseMode(v)` | 设置第三人称鼠标模式(0~3) |
|
|
187
|
+
| `setEnableZoom(v)` | 设置第三人称是否允许滚轮缩放 |
|
|
188
|
+
| `setOverShoulderView(v)` | 开启/关闭过肩视角偏移 |
|
|
189
|
+
| `setPlayerScale(scale)` | 动态设置人物缩放,同步更新碰撞体与所有相关物理参数 |
|
|
190
|
+
| `setDebug(v)` | 开启/关闭碰撞体调试显示 |
|
|
94
191
|
|
|
95
192
|
---
|
|
96
193
|
|
|
@@ -99,22 +196,38 @@ export function playerController(): {
|
|
|
99
196
|
### 全局事件开关
|
|
100
197
|
|
|
101
198
|
```ts
|
|
102
|
-
export function onAllEvent(): void;
|
|
199
|
+
export function onAllEvent(): void; // 打开所有输入事件
|
|
103
200
|
export function offAllEvent(): void; // 关闭所有输入事件
|
|
104
201
|
```
|
|
105
202
|
|
|
106
|
-
### 说明
|
|
107
|
-
|
|
108
203
|
- `onAllEvent()`:确保控制器存在并打开输入监听。
|
|
109
|
-
- `offAllEvent()
|
|
204
|
+
- `offAllEvent()`:关闭输入监听,用于显示 UI 或暂停时禁止玩家输入。
|
|
110
205
|
|
|
111
|
-
|
|
206
|
+
默认处理包括:WASD 移动、奔跑、跳跃、鼠标视角等。
|
|
207
|
+
|
|
208
|
+
### setInput 外部输入
|
|
209
|
+
|
|
210
|
+
可通过 `setInput` 接管输入,适用于自定义按键映射或手柄:
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
player.setInput({
|
|
214
|
+
moveX: 1 | 0 | -1, // 横向移动:1 右,-1 左,0 停
|
|
215
|
+
moveY: 1 | 0 | -1, // 纵向移动:1 前,-1 后,0 停
|
|
216
|
+
lookDeltaX: number, // 视角横向偏移量
|
|
217
|
+
lookDeltaY: number, // 视角纵向偏移量
|
|
218
|
+
jump: boolean, // 跳跃
|
|
219
|
+
shift: boolean, // 奔跑
|
|
220
|
+
toggleView: boolean, // 切换第一/第三人称
|
|
221
|
+
toggleFly: boolean, // 切换飞行模式
|
|
222
|
+
toggleVehicle: boolean, // 上车/下车
|
|
223
|
+
});
|
|
224
|
+
```
|
|
112
225
|
|
|
113
226
|
---
|
|
114
227
|
|
|
115
228
|
## 三、配置与参数说明
|
|
116
229
|
|
|
117
|
-
###
|
|
230
|
+
### 人物类型定义
|
|
118
231
|
|
|
119
232
|
```ts
|
|
120
233
|
type PlayerControllerOptions = {
|
|
@@ -123,6 +236,7 @@ type PlayerControllerOptions = {
|
|
|
123
236
|
controls: OrbitControls;
|
|
124
237
|
playerModel: {
|
|
125
238
|
url: string;
|
|
239
|
+
scale: number;
|
|
126
240
|
idleAnim: string;
|
|
127
241
|
walkAnim: string;
|
|
128
242
|
runAnim: string;
|
|
@@ -132,10 +246,15 @@ type PlayerControllerOptions = {
|
|
|
132
246
|
backwardAnim?: string;
|
|
133
247
|
flyAnim?: string;
|
|
134
248
|
flyIdleAnim?: string;
|
|
135
|
-
|
|
249
|
+
enterCarAnim?: string;
|
|
250
|
+
exitCarAnim?: string;
|
|
136
251
|
gravity?: number;
|
|
137
252
|
jumpHeight?: number;
|
|
138
253
|
speed?: number;
|
|
254
|
+
playerFlySpeed?: number;
|
|
255
|
+
rotateY?: number;
|
|
256
|
+
headObjName?: string;
|
|
257
|
+
flyEnabled?: boolean;
|
|
139
258
|
};
|
|
140
259
|
initPos?: THREE.Vector3;
|
|
141
260
|
mouseSensity?: number;
|
|
@@ -143,31 +262,87 @@ type PlayerControllerOptions = {
|
|
|
143
262
|
maxCamDistance?: number;
|
|
144
263
|
colliderMeshUrl?: string;
|
|
145
264
|
isShowMobileControls?: boolean;
|
|
146
|
-
thirdMouseMode?:
|
|
265
|
+
thirdMouseMode?: 0 | 1 | 2 | 3;
|
|
147
266
|
enableZoom?: boolean;
|
|
267
|
+
enableOverShoulderView?: boolean;
|
|
268
|
+
};
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 关键字段说明
|
|
272
|
+
|
|
273
|
+
| 字段 | 类型 | 默认 / 说明 |
|
|
274
|
+
|------|-----:|------------|
|
|
275
|
+
| `scene` | `THREE.Scene` | three.js 场景(必填) |
|
|
276
|
+
| `camera` | `THREE.PerspectiveCamera` | three.js 相机(必填) |
|
|
277
|
+
| `controls` | `OrbitControls` | 外部相机控制器(必填) |
|
|
278
|
+
| `playerModel.url` | `string` | 人物模型路径 GLB/GLTF(必填) |
|
|
279
|
+
| `playerModel.scale` | `number` | 人物模型缩放(必填) |
|
|
280
|
+
| `playerModel.idleAnim` / `walkAnim` / `runAnim` / `jumpAnim` | `string` | 动画名,需与模型内动画名一致(必填) |
|
|
281
|
+
| `playerModel.leftWalkAnim` / `rightWalkAnim` / `backwardAnim` | `string` | 左走/右走/后退动画,不填则复用 `walkAnim` |
|
|
282
|
+
| `playerModel.flyAnim` / `flyIdleAnim` | `string` | 飞行/飞行待机动画,不填则复用 `idleAnim` |
|
|
283
|
+
| `playerModel.enterCarAnim` / `exitCarAnim` | `string` | 上车/下车动画(使用车辆功能时必填) |
|
|
284
|
+
| `playerModel.rotateY` | `number` | 模型绕 Y 轴额外旋转偏移,默认 `0` |
|
|
285
|
+
| `playerModel.headObjName` | `string` | 头部节点名称,用于第一人称相机绑定 |
|
|
286
|
+
| `playerModel.speed` | `number` | 移动速度基准值,默认 `300` |
|
|
287
|
+
| `playerModel.gravity` | `number` | 重力加速度基准值,默认 `-2400` |
|
|
288
|
+
| `playerModel.jumpHeight` | `number` | 跳跃高度基准值,默认 `600` |
|
|
289
|
+
| `playerModel.playerFlySpeed` | `number` | 飞行速度基准值,默认 `2100` |
|
|
290
|
+
| `playerModel.flyEnabled` | `boolean` | 是否允许飞行,默认 `true` |
|
|
291
|
+
| `initPos` | `THREE.Vector3` | 初始位置,默认 `(0,0,0)` |
|
|
292
|
+
| `mouseSensity` | `number` | 鼠标灵敏度,默认 `5` |
|
|
293
|
+
| `minCamDistance` / `maxCamDistance` | `number` | 第三人称相机距离限制,默认 `100` / `440` |
|
|
294
|
+
| `colliderMeshUrl` | `string` | 自定义碰撞体模型路径,默认使用场景中所有网格 |
|
|
295
|
+
| `isShowMobileControls` | `boolean` | 移动端是否自动显示虚拟摇杆,默认 `true` |
|
|
296
|
+
| `thirdMouseMode` | `0\|1\|2\|3` | 第三人称鼠标模式,默认 `1`(见下表) |
|
|
297
|
+
| `enableZoom` | `boolean` | 第三人称是否允许滚轮缩放,默认 `false` |
|
|
298
|
+
| `enableOverShoulderView` | `boolean` | 是否开启过肩视角偏移,默认 `false` |
|
|
299
|
+
|
|
300
|
+
**thirdMouseMode 说明:**
|
|
301
|
+
|
|
302
|
+
| 值 | 行为 |
|
|
303
|
+
|----|------|
|
|
304
|
+
| `0` | 隐藏鼠标,鼠标同时控制朝向和视角 |
|
|
305
|
+
| `1` | 隐藏鼠标,鼠标仅控制视角(默认) |
|
|
306
|
+
| `2` | 显示鼠标,拖拽控制朝向和视角 |
|
|
307
|
+
| `3` | 显示鼠标,拖拽仅控制视角 |
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
### 车辆类型定义
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
type VehicleOptions = {
|
|
315
|
+
url: string;
|
|
316
|
+
position: THREE.Vector3;
|
|
317
|
+
wheelsNames: string[];
|
|
318
|
+
scale?: number;
|
|
319
|
+
animations: {
|
|
320
|
+
openDoorAnim?: string;
|
|
321
|
+
};
|
|
322
|
+
boardingPoint: THREE.Vector3;
|
|
323
|
+
seatOffset?: THREE.Vector3;
|
|
324
|
+
chassisRatio?: number;
|
|
325
|
+
suspensionRestLengthRatio?: number;
|
|
326
|
+
followVehicleDirection?: boolean;
|
|
327
|
+
speedMultiplier?: number;
|
|
148
328
|
};
|
|
149
329
|
```
|
|
150
330
|
|
|
151
331
|
### 关键字段说明
|
|
152
332
|
|
|
153
|
-
| 字段
|
|
154
|
-
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `
|
|
158
|
-
| `
|
|
159
|
-
| `
|
|
160
|
-
| `
|
|
161
|
-
| `
|
|
162
|
-
| `
|
|
163
|
-
| `
|
|
164
|
-
| `
|
|
165
|
-
| `
|
|
166
|
-
| `minCamDistance` / `maxCamDistance` | `number` | 第三人称相机距离限制,默认分别为`100`、`440` |
|
|
167
|
-
| `colliderMeshUrl` | `string` | 自制碰撞体模型路径,默认`""` |
|
|
168
|
-
| `isShowMobileControls` | `boolean` | 移动端运行时,是否自动显示移动端控制器,默认`true` |
|
|
169
|
-
| `thirdMouseMode` | `[0, 1, 2, 3]` | 第三人称视角下的不同鼠标控制模式 ,默认`1`(0: 隐藏鼠标控制朝向及视角,1: 隐藏鼠标仅控制视角,2: 显示鼠标拖拽控制朝向及视角, 3: 显示鼠标拖拽仅控制视角) |
|
|
170
|
-
| `enableZoom` | `boolean` | 第三人称模式下是否允许缩放,默认`false` |
|
|
333
|
+
| 字段 | 类型 | 必填 | 默认 | 说明 |
|
|
334
|
+
|------|-----:|:----:|:----:|------|
|
|
335
|
+
| `url` | `string` | 是 | — | 车辆模型路径(GLB/GLTF) |
|
|
336
|
+
| `position` | `THREE.Vector3` | 是 | — | 车辆初始世界坐标 |
|
|
337
|
+
| `wheelsNames` | `string[]` | 是 | — | 车轮节点名称数组,顺序为前左、前右、后左、后右 |
|
|
338
|
+
| `scale` | `number` | 否 | `1` | 模型缩放系数 |
|
|
339
|
+
| `animations.openDoorAnim` | `string` | 否 | — | 车门打开动画片段名称 |
|
|
340
|
+
| `boardingPoint` | `THREE.Vector3` | 是 | — | 上车点局部坐标(相对车辆模型坐标系) |
|
|
341
|
+
| `seatOffset` | `THREE.Vector3` | 否 | `(0,0,0)` | 座位偏移,用于微调人物坐入后的位置 |
|
|
342
|
+
| `chassisRatio` | `number` | 否 | `0.2` | 底盘高度相对于轮胎直径的比例(影响模型位置) |
|
|
343
|
+
| `suspensionRestLengthRatio` | `number` | 否 | `0.2` | 悬架弹簧静止长度相对于轮胎直径的比例(影响碰撞底盘高度) |
|
|
344
|
+
| `followVehicleDirection` | `boolean` | 否 | `true` | 行驶时相机是否跟随车辆速度方向自动转向车辆正后方 |
|
|
345
|
+
| `speedMultiplier` | `number` | 否 | `1` | 车辆速度倍率,用于调节不同车辆的速度差异 |
|
|
171
346
|
|
|
172
347
|
---
|
|
173
348
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,65 @@
|
|
|
1
|
+
import { RigidBody } from '@dimforge/rapier3d-compat';
|
|
1
2
|
import * as THREE from 'three';
|
|
2
3
|
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
|
|
3
4
|
|
|
5
|
+
/**
|
|
6
|
+
* 障碍物检测接口
|
|
7
|
+
*/
|
|
8
|
+
interface ObstacleChecker {
|
|
9
|
+
/**
|
|
10
|
+
* 检查两点之间的线段是否被障碍物阻挡
|
|
11
|
+
*/
|
|
12
|
+
isBlocked(start: THREE.Vector3, end: THREE.Vector3): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* 获取障碍物周围的导航节点
|
|
15
|
+
*/
|
|
16
|
+
getNavigationNodes(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 路径规划器配置
|
|
20
|
+
*/
|
|
21
|
+
interface PathPlannerConfig {
|
|
22
|
+
debugEnabled?: boolean;
|
|
23
|
+
scene?: THREE.Scene;
|
|
24
|
+
scale?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A*路径规划器
|
|
28
|
+
*/
|
|
29
|
+
declare class PathPlanner {
|
|
30
|
+
private obstacleChecker;
|
|
31
|
+
private config;
|
|
32
|
+
private debugLines;
|
|
33
|
+
private debugPoints;
|
|
34
|
+
constructor(obstacleChecker: ObstacleChecker, config?: PathPlannerConfig);
|
|
35
|
+
private heuristic;
|
|
36
|
+
findPath(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
37
|
+
/**
|
|
38
|
+
* 重建路径
|
|
39
|
+
*/
|
|
40
|
+
private reconstructPath;
|
|
41
|
+
/**
|
|
42
|
+
* 路径平滑
|
|
43
|
+
*/
|
|
44
|
+
private smoothPath;
|
|
45
|
+
/**
|
|
46
|
+
* 可视化路径
|
|
47
|
+
*/
|
|
48
|
+
private visualizePath;
|
|
49
|
+
/**
|
|
50
|
+
* 清除路径可视化
|
|
51
|
+
*/
|
|
52
|
+
clearVisualization(): void;
|
|
53
|
+
/**
|
|
54
|
+
* 更新配置
|
|
55
|
+
*/
|
|
56
|
+
updateConfig(config: Partial<PathPlannerConfig>): void;
|
|
57
|
+
/**
|
|
58
|
+
* 销毁
|
|
59
|
+
*/
|
|
60
|
+
dispose(): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
4
63
|
type PlayerControllerOptions = {
|
|
5
64
|
scene: THREE.Scene;
|
|
6
65
|
camera: THREE.PerspectiveCamera;
|
|
@@ -16,11 +75,16 @@ type PlayerControllerOptions = {
|
|
|
16
75
|
backwardAnim?: string;
|
|
17
76
|
flyAnim?: string;
|
|
18
77
|
flyIdleAnim?: string;
|
|
78
|
+
enterCarAnim?: string;
|
|
79
|
+
exitCarAnim?: string;
|
|
19
80
|
scale: number;
|
|
20
81
|
gravity?: number;
|
|
21
82
|
jumpHeight?: number;
|
|
22
83
|
speed?: number;
|
|
84
|
+
playerFlySpeed?: number;
|
|
23
85
|
rotateY?: number;
|
|
86
|
+
headObjName?: string;
|
|
87
|
+
flyEnabled?: boolean;
|
|
24
88
|
};
|
|
25
89
|
initPos?: THREE.Vector3;
|
|
26
90
|
mouseSensity?: number;
|
|
@@ -30,28 +94,75 @@ type PlayerControllerOptions = {
|
|
|
30
94
|
isShowMobileControls?: boolean;
|
|
31
95
|
thirdMouseMode?: 0 | 1 | 2 | 3;
|
|
32
96
|
enableZoom?: boolean;
|
|
97
|
+
enableOverShoulderView?: boolean;
|
|
98
|
+
};
|
|
99
|
+
type VehicleOptions = {
|
|
100
|
+
url: string;
|
|
101
|
+
position: THREE.Vector3;
|
|
102
|
+
wheelsNames: string[];
|
|
103
|
+
scale?: number;
|
|
104
|
+
animations: {
|
|
105
|
+
openDoorAnim?: string;
|
|
106
|
+
};
|
|
107
|
+
boardingPoint: THREE.Vector3;
|
|
108
|
+
seatOffset?: THREE.Vector3;
|
|
109
|
+
chassisRatio?: number;
|
|
110
|
+
suspensionRestLengthRatio?: number;
|
|
111
|
+
followVehicleDirection?: boolean;
|
|
112
|
+
speedMultiplier?: number;
|
|
113
|
+
};
|
|
114
|
+
type VehicleInstance = {
|
|
115
|
+
vehicleGroup: THREE.Group;
|
|
116
|
+
chassisBody: RigidBody;
|
|
117
|
+
vehicleController: any;
|
|
118
|
+
updateWheelVisuals: () => void;
|
|
119
|
+
vehicleMixer?: THREE.AnimationMixer;
|
|
120
|
+
vehicleActions?: Map<string, THREE.AnimationAction>;
|
|
121
|
+
vehiclIsOpenDoor: boolean;
|
|
122
|
+
vehicleBBox: THREE.Box3;
|
|
123
|
+
pathPlanner: PathPlanner;
|
|
124
|
+
scale: number;
|
|
125
|
+
boardingPoint: THREE.Vector3;
|
|
126
|
+
seatOffset: THREE.Vector3;
|
|
127
|
+
enterVehicleTime: number;
|
|
128
|
+
chassisRatio: number;
|
|
129
|
+
suspensionRestLengthRatio: number;
|
|
130
|
+
size: {
|
|
131
|
+
l: number;
|
|
132
|
+
w: number;
|
|
133
|
+
h: number;
|
|
134
|
+
};
|
|
135
|
+
speedMultiplier: number;
|
|
33
136
|
};
|
|
34
137
|
declare function playerController(): {
|
|
35
138
|
init: (opts: PlayerControllerOptions, callback?: () => void) => Promise<void>;
|
|
139
|
+
loadVehicleModel: (params: VehicleOptions) => Promise<void>;
|
|
36
140
|
changeView: () => void;
|
|
37
141
|
reset: (pos?: THREE.Vector3) => void;
|
|
38
142
|
update: (dt?: number) => Promise<void>;
|
|
39
143
|
destroy: () => void;
|
|
40
144
|
setInput: (i: any) => void;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
145
|
+
getPosition: () => THREE.Vector3;
|
|
146
|
+
getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>>;
|
|
147
|
+
getPerson: () => THREE.Object3D<THREE.Object3DEventMap>;
|
|
148
|
+
getActiveVehicle: () => VehicleInstance;
|
|
149
|
+
getAllVehicles: () => VehicleInstance[];
|
|
150
|
+
switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => Promise<void>;
|
|
151
|
+
setMouseSensitivity: (mouseSensity: number) => void;
|
|
152
|
+
setGravity: (gravity: number) => void;
|
|
153
|
+
setJumpHeight: (jumpHeight: number) => void;
|
|
154
|
+
setPlayerSpeed: (playerSpeed: number) => void;
|
|
155
|
+
setPlayerFlySpeed: (playerFlySpeed: number) => void;
|
|
156
|
+
setMinCamDistance: (minCamDistance: number) => void;
|
|
157
|
+
setMaxCamDistance: (maxCamDistance: number) => void;
|
|
158
|
+
setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
|
|
159
|
+
setEnableZoom: (enableZoom: boolean) => void;
|
|
160
|
+
setDebug: (debug: boolean) => void;
|
|
161
|
+
setOverShoulderView: (enable: boolean) => void;
|
|
162
|
+
setPlayerScale: (scale: number) => void;
|
|
53
163
|
};
|
|
164
|
+
type playerController = ReturnType<typeof playerController>;
|
|
54
165
|
declare function onAllEvent(): void;
|
|
55
166
|
declare function offAllEvent(): void;
|
|
56
167
|
|
|
57
|
-
export { type PlayerControllerOptions, offAllEvent, onAllEvent, playerController };
|
|
168
|
+
export { type PlayerControllerOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
|