three-player-controller 0.3.7 → 0.3.9
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 +80 -30
- package/dist/index.d.mts +63 -84
- package/dist/index.d.ts +63 -84
- package/dist/index.js +1162 -1794
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1161 -1794
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[English](README_En.md)
|
|
1
|
+
中文 | [English](README_En.md)
|
|
2
2
|
|
|
3
3
|
# three-player-controller
|
|
4
4
|
|
|
@@ -82,7 +82,7 @@ await player.init({
|
|
|
82
82
|
runAnim: "run", // Run 动画名
|
|
83
83
|
jumpAnim: "jump", // Jump 动画名
|
|
84
84
|
},
|
|
85
|
-
initPos: new THREE.Vector3(0, 0, 0),
|
|
85
|
+
initPos: new THREE.Vector3(0, 0, 0),
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
// 加入车辆控制
|
|
@@ -117,38 +117,24 @@ player.update();
|
|
|
117
117
|
|
|
118
118
|
```ts
|
|
119
119
|
export function playerController(): {
|
|
120
|
-
// 初始化
|
|
121
120
|
init: (opts: PlayerControllerOptions, callback?: () => void) => void;
|
|
122
|
-
// 加载车辆模型
|
|
123
121
|
loadVehicleModel: (params: VehicleOptions) => void;
|
|
124
|
-
// 切换人物模型
|
|
125
122
|
switchPlayerModel: (model: PlayerControllerOptions["playerModel"]) => void;
|
|
126
|
-
// 切换第一/第三人称
|
|
127
123
|
changeView: () => void;
|
|
128
|
-
// 复位玩家位置
|
|
129
124
|
reset: (pos?: THREE.Vector3) => void;
|
|
130
|
-
// 每帧调用
|
|
131
125
|
update: (dt?: number) => void;
|
|
132
|
-
// 销毁控制器
|
|
133
126
|
destroy: () => void;
|
|
134
|
-
// 外部输入控制
|
|
135
127
|
setInput: (input: PlayerInput) => void;
|
|
136
|
-
// 获取人物当前位置
|
|
137
128
|
getPosition: () => THREE.Vector3;
|
|
138
|
-
// 获取屏幕中心射线与场景的交点
|
|
139
129
|
getCenterScreenRaycastHit: () => THREE.Intersection | undefined;
|
|
140
|
-
// 获取人物模型
|
|
141
130
|
getPerson: () => THREE.Object3D | null;
|
|
142
|
-
// 获取当前驾驶的车辆实例
|
|
143
131
|
getActiveVehicle: () => VehicleInstance | null;
|
|
144
|
-
// 获取所有车辆实例
|
|
145
132
|
getAllVehicles: () => VehicleInstance[];
|
|
146
|
-
// 动态参数调整
|
|
147
133
|
setMouseSensitivity: (mouseSensity: number) => void;
|
|
148
134
|
setGravity: (gravity: number) => void;
|
|
149
135
|
setJumpHeight: (jumpHeight: number) => void;
|
|
150
136
|
setPlayerSpeed: (playerSpeed: number) => void;
|
|
151
|
-
|
|
137
|
+
setPlayerFlySpeed: (playerFlySpeed: number) => void;
|
|
152
138
|
setMinCamDistance: (minCamDistance: number) => void;
|
|
153
139
|
setMaxCamDistance: (maxCamDistance: number) => void;
|
|
154
140
|
setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
|
|
@@ -156,6 +142,18 @@ export function playerController(): {
|
|
|
156
142
|
setOverShoulderView: (enable: boolean) => void;
|
|
157
143
|
setPlayerScale: (scale: number) => void;
|
|
158
144
|
setDebug: (debug: boolean) => void;
|
|
145
|
+
getCurrentPersonAnimationName: () => string | null;
|
|
146
|
+
registerAnimation: (key: string, clipName: string, opts?: {
|
|
147
|
+
loop?: boolean;
|
|
148
|
+
timeScale?: number;
|
|
149
|
+
duration?: number;
|
|
150
|
+
clampWhenFinished?: boolean;
|
|
151
|
+
onFinished?: () => void;
|
|
152
|
+
}) => void;
|
|
153
|
+
playAnimation: (key: string, opts?: {
|
|
154
|
+
fade?: number;
|
|
155
|
+
force?: boolean;
|
|
156
|
+
}) => void;
|
|
159
157
|
};
|
|
160
158
|
```
|
|
161
159
|
|
|
@@ -180,7 +178,7 @@ export function playerController(): {
|
|
|
180
178
|
| `setGravity(v)` | 设置重力(传入基准值,内部自动乘以 scale) |
|
|
181
179
|
| `setJumpHeight(v)` | 设置跳跃高度(传入基准值,内部自动乘以 scale) |
|
|
182
180
|
| `setPlayerSpeed(v)` | 设置移动速度(传入基准值,内部自动乘以 scale) |
|
|
183
|
-
| `
|
|
181
|
+
| `setPlayerFlySpeed(v)` | 设置飞行速度(传入基准值,内部自动乘以 scale) |
|
|
184
182
|
| `setMinCamDistance(v)` | 设置第三人称最小相机距离 |
|
|
185
183
|
| `setMaxCamDistance(v)` | 设置第三人称最大相机距离 |
|
|
186
184
|
| `setThirdMouseMode(v)` | 设置第三人称鼠标模式(0~3) |
|
|
@@ -188,6 +186,9 @@ export function playerController(): {
|
|
|
188
186
|
| `setOverShoulderView(v)` | 开启/关闭过肩视角偏移 |
|
|
189
187
|
| `setPlayerScale(scale)` | 动态设置人物缩放,同步更新碰撞体与所有相关物理参数 |
|
|
190
188
|
| `setDebug(v)` | 开启/关闭碰撞体调试显示 |
|
|
189
|
+
| `getCurrentPersonAnimationName()` | 获取当前正在播放的动画名称 |
|
|
190
|
+
| `registerAnimation(key, clipName, opts?)` | 注册一个自定义动画,之后可通过 `playAnimation` 播放 |
|
|
191
|
+
| `playAnimation(key, opts?)` | 播放已注册的自定义动画 |
|
|
191
192
|
|
|
192
193
|
---
|
|
193
194
|
|
|
@@ -211,15 +212,15 @@ export function offAllEvent(): void; // 关闭所有输入事件
|
|
|
211
212
|
|
|
212
213
|
```ts
|
|
213
214
|
player.setInput({
|
|
214
|
-
moveX: 1 | 0 | -1,
|
|
215
|
-
moveY: 1 | 0 | -1,
|
|
216
|
-
lookDeltaX: number,
|
|
217
|
-
lookDeltaY: number,
|
|
218
|
-
jump: boolean,
|
|
219
|
-
shift: boolean,
|
|
220
|
-
toggleView: boolean,
|
|
221
|
-
toggleFly: boolean,
|
|
222
|
-
toggleVehicle: boolean,
|
|
215
|
+
moveX: 1 | 0 | -1, // 横向移动:1 右,-1 左,0 停
|
|
216
|
+
moveY: 1 | 0 | -1, // 纵向移动:1 前,-1 后,0 停
|
|
217
|
+
lookDeltaX: number, // 视角横向偏移量
|
|
218
|
+
lookDeltaY: number, // 视角纵向偏移量
|
|
219
|
+
jump: boolean, // 跳跃
|
|
220
|
+
shift: boolean, // 奔跑
|
|
221
|
+
toggleView: boolean, // 切换第一/第三人称
|
|
222
|
+
toggleFly: boolean, // 切换飞行模式
|
|
223
|
+
toggleVehicle: boolean, // 上车/下车
|
|
223
224
|
});
|
|
224
225
|
```
|
|
225
226
|
|
|
@@ -255,6 +256,7 @@ type PlayerControllerOptions = {
|
|
|
255
256
|
rotateY?: number;
|
|
256
257
|
headObjName?: string;
|
|
257
258
|
flyEnabled?: boolean;
|
|
259
|
+
capsuleRadiusRatio?: number;
|
|
258
260
|
};
|
|
259
261
|
initPos?: THREE.Vector3;
|
|
260
262
|
mouseSensity?: number;
|
|
@@ -304,14 +306,13 @@ type PlayerControllerOptions = {
|
|
|
304
306
|
| `thirdMouseMode` | `0\|1\|2\|3` | 否 | `1` | 第三人称鼠标模式(见下表) |
|
|
305
307
|
| `enableZoom` | `boolean` | 否 | `false` | 第三人称是否允许滚轮缩放 |
|
|
306
308
|
| `enableOverShoulderView` | `boolean` | 否 | `false` | 是否开启过肩视角偏移 |
|
|
307
|
-
| `capsuleRadiusRatio` | `number` | 否 | `1.0` | 玩家胶囊碰撞体的半径系数,值越大碰撞范围越宽 |
|
|
308
309
|
|
|
309
310
|
**thirdMouseMode 说明:**
|
|
310
311
|
|
|
311
312
|
| 值 | 行为 |
|
|
312
313
|
|----|------|
|
|
313
|
-
| `0` |
|
|
314
|
-
| `1` |
|
|
314
|
+
| `0` | 隐藏鼠标,同时控制朝向和视角 |
|
|
315
|
+
| `1` | 隐藏鼠标,仅控制视角(默认) |
|
|
315
316
|
| `2` | 显示鼠标,拖拽控制朝向和视角 |
|
|
316
317
|
| `3` | 显示鼠标,拖拽仅控制视角 |
|
|
317
318
|
|
|
@@ -355,6 +356,55 @@ type VehicleOptions = {
|
|
|
355
356
|
|
|
356
357
|
---
|
|
357
358
|
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 四、自定义动画
|
|
362
|
+
|
|
363
|
+
除内置动画外,可在加载模型后注册并播放自定义动画片段。
|
|
364
|
+
|
|
365
|
+
### registerAnimation
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
player.registerAnimation(key, clipName, opts?)
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
| 参数 | 类型 | 说明 |
|
|
372
|
+
|------|------|------|
|
|
373
|
+
| `key` | `string` | 动画标识符,之后通过此 key 播放 |
|
|
374
|
+
| `clipName` | `string` | GLB 模型内动画片段的原始名称 |
|
|
375
|
+
| `opts.loop` | `boolean` | 是否循环,默认 `true` |
|
|
376
|
+
| `opts.timeScale` | `number` | 播放速度倍率,默认 `1` |
|
|
377
|
+
| `opts.duration` | `number` | 指定播放时长(秒),会自动计算 timeScale,与 `timeScale` 二选一 |
|
|
378
|
+
| `opts.clampWhenFinished` | `boolean` | 单次播放结束后是否停在最后一帧,默认 `false` |
|
|
379
|
+
| `opts.onFinished` | `() => void` | 动画播放完毕回调(仅单次播放时有效) |
|
|
380
|
+
|
|
381
|
+
### playAnimation
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
player.playAnimation(key, opts?)
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
| 参数 | 类型 | 说明 |
|
|
388
|
+
|------|------|------|
|
|
389
|
+
| `key` | `string` | 已注册的动画标识符 |
|
|
390
|
+
| `opts.fade` | `number` | 过渡时间(秒),默认 `0.18` |
|
|
391
|
+
| `opts.force` | `boolean` | 是否强制从头重播(即使当前已在播放该动画) |
|
|
392
|
+
|
|
393
|
+
**示例:**
|
|
394
|
+
|
|
395
|
+
```ts
|
|
396
|
+
// 注册一个单次播放、播完回调的动画
|
|
397
|
+
player.registerAnimation("attack", "Attack_Clip", {
|
|
398
|
+
loop: false,
|
|
399
|
+
duration: 1.2,
|
|
400
|
+
clampWhenFinished: true,
|
|
401
|
+
onFinished: () => console.log("攻击结束"),
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
// 播放
|
|
405
|
+
player.playAnimation("attack", { force: true });
|
|
406
|
+
```
|
|
407
|
+
|
|
358
408
|
# 感谢
|
|
359
409
|
|
|
360
410
|
[three-mesh-bvh](https://github.com/gkjohnson/three-mesh-bvh)
|
package/dist/index.d.mts
CHANGED
|
@@ -1,94 +1,61 @@
|
|
|
1
|
-
import { RigidBody } from '@dimforge/rapier3d-compat';
|
|
2
1
|
import * as THREE from 'three';
|
|
3
|
-
import {
|
|
2
|
+
import { RigidBody } from '@dimforge/rapier3d-compat';
|
|
4
3
|
|
|
5
|
-
/**
|
|
6
|
-
* 障碍物检测接口
|
|
7
|
-
*/
|
|
8
4
|
interface ObstacleChecker {
|
|
9
|
-
/**
|
|
10
|
-
* 检查两点之间的线段是否被障碍物阻挡
|
|
11
|
-
*/
|
|
12
5
|
isBlocked(start: THREE.Vector3, end: THREE.Vector3): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* 获取障碍物周围的导航节点
|
|
15
|
-
*/
|
|
16
6
|
getNavigationNodes(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
17
7
|
}
|
|
18
|
-
/**
|
|
19
|
-
* 路径规划器配置
|
|
20
|
-
*/
|
|
21
8
|
interface PathPlannerConfig {
|
|
22
9
|
debugEnabled?: boolean;
|
|
23
10
|
scene?: THREE.Scene;
|
|
24
11
|
scale?: number;
|
|
25
12
|
}
|
|
26
|
-
/**
|
|
27
|
-
* A*路径规划器
|
|
28
|
-
*/
|
|
29
13
|
declare class PathPlanner {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
obstacleChecker: ObstacleChecker;
|
|
15
|
+
config: PathPlannerConfig;
|
|
16
|
+
debugLines: THREE.Line[];
|
|
17
|
+
debugPoints: THREE.Mesh[];
|
|
34
18
|
constructor(obstacleChecker: ObstacleChecker, config?: PathPlannerConfig);
|
|
35
19
|
private heuristic;
|
|
36
20
|
findPath(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
37
|
-
/**
|
|
38
|
-
* 重建路径
|
|
39
|
-
*/
|
|
40
21
|
private reconstructPath;
|
|
41
|
-
/**
|
|
42
|
-
* 路径平滑
|
|
43
|
-
*/
|
|
44
22
|
private smoothPath;
|
|
45
|
-
/**
|
|
46
|
-
* 可视化路径
|
|
47
|
-
*/
|
|
48
23
|
private visualizePath;
|
|
49
|
-
/**
|
|
50
|
-
* 清除路径可视化
|
|
51
|
-
*/
|
|
52
24
|
clearVisualization(): void;
|
|
53
|
-
/**
|
|
54
|
-
* 更新配置
|
|
55
|
-
*/
|
|
56
25
|
updateConfig(config: Partial<PathPlannerConfig>): void;
|
|
57
|
-
/**
|
|
58
|
-
* 销毁
|
|
59
|
-
*/
|
|
60
26
|
dispose(): void;
|
|
61
27
|
}
|
|
62
28
|
|
|
29
|
+
type PlayerModelOptions = {
|
|
30
|
+
url: string;
|
|
31
|
+
scale: number;
|
|
32
|
+
idleAnim: string;
|
|
33
|
+
walkAnim: string;
|
|
34
|
+
runAnim: string;
|
|
35
|
+
jumpAnim: string;
|
|
36
|
+
leftWalkAnim?: string;
|
|
37
|
+
rightWalkAnim?: string;
|
|
38
|
+
backwardAnim?: string;
|
|
39
|
+
flyAnim?: string;
|
|
40
|
+
flyIdleAnim?: string;
|
|
41
|
+
enterCarAnim?: string;
|
|
42
|
+
exitCarAnim?: string;
|
|
43
|
+
gravity?: number;
|
|
44
|
+
jumpHeight?: number;
|
|
45
|
+
speed?: number;
|
|
46
|
+
flySpeed?: number;
|
|
47
|
+
rotateY?: number;
|
|
48
|
+
headObjName?: string;
|
|
49
|
+
flyEnabled?: boolean;
|
|
50
|
+
capsuleRadiusRatio?: number;
|
|
51
|
+
};
|
|
63
52
|
type PlayerControllerOptions = {
|
|
64
53
|
scene: THREE.Scene;
|
|
65
54
|
camera: THREE.PerspectiveCamera;
|
|
66
|
-
controls:
|
|
67
|
-
playerModel:
|
|
68
|
-
url: string;
|
|
69
|
-
idleAnim: string;
|
|
70
|
-
walkAnim: string;
|
|
71
|
-
runAnim: string;
|
|
72
|
-
jumpAnim: string;
|
|
73
|
-
leftWalkAnim?: string;
|
|
74
|
-
rightWalkAnim?: string;
|
|
75
|
-
backwardAnim?: string;
|
|
76
|
-
flyAnim?: string;
|
|
77
|
-
flyIdleAnim?: string;
|
|
78
|
-
enterCarAnim?: string;
|
|
79
|
-
exitCarAnim?: string;
|
|
80
|
-
scale: number;
|
|
81
|
-
gravity?: number;
|
|
82
|
-
jumpHeight?: number;
|
|
83
|
-
speed?: number;
|
|
84
|
-
flySpeed?: number;
|
|
85
|
-
rotateY?: number;
|
|
86
|
-
headObjName?: string;
|
|
87
|
-
flyEnabled?: boolean;
|
|
88
|
-
capsuleRadiusRatio?: number;
|
|
89
|
-
};
|
|
55
|
+
controls: any;
|
|
56
|
+
playerModel: PlayerModelOptions;
|
|
90
57
|
initPos?: THREE.Vector3;
|
|
91
|
-
|
|
58
|
+
mouseSensitivity?: number;
|
|
92
59
|
minCamDistance?: number;
|
|
93
60
|
maxCamDistance?: number;
|
|
94
61
|
colliderMeshUrl?: string;
|
|
@@ -135,35 +102,47 @@ type VehicleInstance = {
|
|
|
135
102
|
};
|
|
136
103
|
speedMultiplier: number;
|
|
137
104
|
};
|
|
105
|
+
|
|
138
106
|
declare function playerController(): {
|
|
139
|
-
init: (opts: PlayerControllerOptions,
|
|
140
|
-
loadVehicleModel: (
|
|
141
|
-
changeView: () => void;
|
|
142
|
-
reset: (pos?: THREE.Vector3) => void;
|
|
107
|
+
init: (opts: PlayerControllerOptions, cb?: () => void) => Promise<void>;
|
|
108
|
+
loadVehicleModel: (opts: VehicleOptions) => Promise<void>;
|
|
143
109
|
update: (dt?: number) => Promise<void>;
|
|
144
110
|
destroy: () => void;
|
|
111
|
+
reset: (pos?: THREE.Vector3) => void;
|
|
145
112
|
setInput: (i: any) => void;
|
|
113
|
+
changeView: () => void;
|
|
146
114
|
getPosition: () => THREE.Vector3;
|
|
147
|
-
getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap
|
|
148
|
-
|
|
149
|
-
|
|
115
|
+
getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>> | undefined;
|
|
116
|
+
getCurrentPersonAnimationName: () => string | null;
|
|
117
|
+
getPerson: () => THREE.Object3D<THREE.Object3DEventMap> | null;
|
|
118
|
+
getActiveVehicle: () => VehicleInstance | null;
|
|
150
119
|
getAllVehicles: () => VehicleInstance[];
|
|
151
|
-
switchPlayerModel: (model:
|
|
152
|
-
setMouseSensitivity: (mouseSensity: number) => void;
|
|
153
|
-
setGravity: (gravity: number) => void;
|
|
154
|
-
setJumpHeight: (jumpHeight: number) => void;
|
|
155
|
-
setPlayerSpeed: (playerSpeed: number) => void;
|
|
156
|
-
setPlayerFlySpeed: (playerFlySpeed: number) => void;
|
|
157
|
-
setMinCamDistance: (minCamDistance: number) => void;
|
|
158
|
-
setMaxCamDistance: (maxCamDistance: number) => void;
|
|
159
|
-
setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
|
|
160
|
-
setEnableZoom: (enableZoom: boolean) => void;
|
|
161
|
-
setDebug: (debug: boolean) => void;
|
|
162
|
-
setOverShoulderView: (enable: boolean) => void;
|
|
120
|
+
switchPlayerModel: (model: PlayerModelOptions) => Promise<void>;
|
|
163
121
|
setPlayerScale: (scale: number) => void;
|
|
122
|
+
setMouseSensitivity: (v: number) => void;
|
|
123
|
+
setGravity: (v: number) => void;
|
|
124
|
+
setJumpHeight: (v: number) => void;
|
|
125
|
+
setPlayerSpeed: (v: number) => void;
|
|
126
|
+
setPlayerFlySpeed: (v: number) => void;
|
|
127
|
+
setMinCamDistance: (v: number) => void;
|
|
128
|
+
setMaxCamDistance: (v: number) => void;
|
|
129
|
+
setThirdMouseMode: (v: 0 | 1 | 2 | 3) => void;
|
|
130
|
+
setEnableZoom: (v: boolean) => void;
|
|
131
|
+
setDebug: (v: boolean) => void;
|
|
132
|
+
setOverShoulderView: (v: boolean) => void;
|
|
133
|
+
registerAnimation: (key: string, clipName: string, opts?: {
|
|
134
|
+
loop?: boolean;
|
|
135
|
+
timeScale?: number;
|
|
136
|
+
clampWhenFinished?: boolean;
|
|
137
|
+
onFinished?: () => void;
|
|
138
|
+
}) => void;
|
|
139
|
+
playAnimation: (key: string, opts?: {
|
|
140
|
+
fade?: number;
|
|
141
|
+
force?: boolean;
|
|
142
|
+
}) => void;
|
|
164
143
|
};
|
|
165
144
|
type playerController = ReturnType<typeof playerController>;
|
|
166
145
|
declare function onAllEvent(): void;
|
|
167
146
|
declare function offAllEvent(): void;
|
|
168
147
|
|
|
169
|
-
export { type PlayerControllerOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
|
|
148
|
+
export { type PlayerControllerOptions, type PlayerModelOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,94 +1,61 @@
|
|
|
1
|
-
import { RigidBody } from '@dimforge/rapier3d-compat';
|
|
2
1
|
import * as THREE from 'three';
|
|
3
|
-
import {
|
|
2
|
+
import { RigidBody } from '@dimforge/rapier3d-compat';
|
|
4
3
|
|
|
5
|
-
/**
|
|
6
|
-
* 障碍物检测接口
|
|
7
|
-
*/
|
|
8
4
|
interface ObstacleChecker {
|
|
9
|
-
/**
|
|
10
|
-
* 检查两点之间的线段是否被障碍物阻挡
|
|
11
|
-
*/
|
|
12
5
|
isBlocked(start: THREE.Vector3, end: THREE.Vector3): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* 获取障碍物周围的导航节点
|
|
15
|
-
*/
|
|
16
6
|
getNavigationNodes(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
17
7
|
}
|
|
18
|
-
/**
|
|
19
|
-
* 路径规划器配置
|
|
20
|
-
*/
|
|
21
8
|
interface PathPlannerConfig {
|
|
22
9
|
debugEnabled?: boolean;
|
|
23
10
|
scene?: THREE.Scene;
|
|
24
11
|
scale?: number;
|
|
25
12
|
}
|
|
26
|
-
/**
|
|
27
|
-
* A*路径规划器
|
|
28
|
-
*/
|
|
29
13
|
declare class PathPlanner {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
obstacleChecker: ObstacleChecker;
|
|
15
|
+
config: PathPlannerConfig;
|
|
16
|
+
debugLines: THREE.Line[];
|
|
17
|
+
debugPoints: THREE.Mesh[];
|
|
34
18
|
constructor(obstacleChecker: ObstacleChecker, config?: PathPlannerConfig);
|
|
35
19
|
private heuristic;
|
|
36
20
|
findPath(start: THREE.Vector3, goal: THREE.Vector3): THREE.Vector3[];
|
|
37
|
-
/**
|
|
38
|
-
* 重建路径
|
|
39
|
-
*/
|
|
40
21
|
private reconstructPath;
|
|
41
|
-
/**
|
|
42
|
-
* 路径平滑
|
|
43
|
-
*/
|
|
44
22
|
private smoothPath;
|
|
45
|
-
/**
|
|
46
|
-
* 可视化路径
|
|
47
|
-
*/
|
|
48
23
|
private visualizePath;
|
|
49
|
-
/**
|
|
50
|
-
* 清除路径可视化
|
|
51
|
-
*/
|
|
52
24
|
clearVisualization(): void;
|
|
53
|
-
/**
|
|
54
|
-
* 更新配置
|
|
55
|
-
*/
|
|
56
25
|
updateConfig(config: Partial<PathPlannerConfig>): void;
|
|
57
|
-
/**
|
|
58
|
-
* 销毁
|
|
59
|
-
*/
|
|
60
26
|
dispose(): void;
|
|
61
27
|
}
|
|
62
28
|
|
|
29
|
+
type PlayerModelOptions = {
|
|
30
|
+
url: string;
|
|
31
|
+
scale: number;
|
|
32
|
+
idleAnim: string;
|
|
33
|
+
walkAnim: string;
|
|
34
|
+
runAnim: string;
|
|
35
|
+
jumpAnim: string;
|
|
36
|
+
leftWalkAnim?: string;
|
|
37
|
+
rightWalkAnim?: string;
|
|
38
|
+
backwardAnim?: string;
|
|
39
|
+
flyAnim?: string;
|
|
40
|
+
flyIdleAnim?: string;
|
|
41
|
+
enterCarAnim?: string;
|
|
42
|
+
exitCarAnim?: string;
|
|
43
|
+
gravity?: number;
|
|
44
|
+
jumpHeight?: number;
|
|
45
|
+
speed?: number;
|
|
46
|
+
flySpeed?: number;
|
|
47
|
+
rotateY?: number;
|
|
48
|
+
headObjName?: string;
|
|
49
|
+
flyEnabled?: boolean;
|
|
50
|
+
capsuleRadiusRatio?: number;
|
|
51
|
+
};
|
|
63
52
|
type PlayerControllerOptions = {
|
|
64
53
|
scene: THREE.Scene;
|
|
65
54
|
camera: THREE.PerspectiveCamera;
|
|
66
|
-
controls:
|
|
67
|
-
playerModel:
|
|
68
|
-
url: string;
|
|
69
|
-
idleAnim: string;
|
|
70
|
-
walkAnim: string;
|
|
71
|
-
runAnim: string;
|
|
72
|
-
jumpAnim: string;
|
|
73
|
-
leftWalkAnim?: string;
|
|
74
|
-
rightWalkAnim?: string;
|
|
75
|
-
backwardAnim?: string;
|
|
76
|
-
flyAnim?: string;
|
|
77
|
-
flyIdleAnim?: string;
|
|
78
|
-
enterCarAnim?: string;
|
|
79
|
-
exitCarAnim?: string;
|
|
80
|
-
scale: number;
|
|
81
|
-
gravity?: number;
|
|
82
|
-
jumpHeight?: number;
|
|
83
|
-
speed?: number;
|
|
84
|
-
flySpeed?: number;
|
|
85
|
-
rotateY?: number;
|
|
86
|
-
headObjName?: string;
|
|
87
|
-
flyEnabled?: boolean;
|
|
88
|
-
capsuleRadiusRatio?: number;
|
|
89
|
-
};
|
|
55
|
+
controls: any;
|
|
56
|
+
playerModel: PlayerModelOptions;
|
|
90
57
|
initPos?: THREE.Vector3;
|
|
91
|
-
|
|
58
|
+
mouseSensitivity?: number;
|
|
92
59
|
minCamDistance?: number;
|
|
93
60
|
maxCamDistance?: number;
|
|
94
61
|
colliderMeshUrl?: string;
|
|
@@ -135,35 +102,47 @@ type VehicleInstance = {
|
|
|
135
102
|
};
|
|
136
103
|
speedMultiplier: number;
|
|
137
104
|
};
|
|
105
|
+
|
|
138
106
|
declare function playerController(): {
|
|
139
|
-
init: (opts: PlayerControllerOptions,
|
|
140
|
-
loadVehicleModel: (
|
|
141
|
-
changeView: () => void;
|
|
142
|
-
reset: (pos?: THREE.Vector3) => void;
|
|
107
|
+
init: (opts: PlayerControllerOptions, cb?: () => void) => Promise<void>;
|
|
108
|
+
loadVehicleModel: (opts: VehicleOptions) => Promise<void>;
|
|
143
109
|
update: (dt?: number) => Promise<void>;
|
|
144
110
|
destroy: () => void;
|
|
111
|
+
reset: (pos?: THREE.Vector3) => void;
|
|
145
112
|
setInput: (i: any) => void;
|
|
113
|
+
changeView: () => void;
|
|
146
114
|
getPosition: () => THREE.Vector3;
|
|
147
|
-
getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap
|
|
148
|
-
|
|
149
|
-
|
|
115
|
+
getCenterScreenRaycastHit: () => THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>> | undefined;
|
|
116
|
+
getCurrentPersonAnimationName: () => string | null;
|
|
117
|
+
getPerson: () => THREE.Object3D<THREE.Object3DEventMap> | null;
|
|
118
|
+
getActiveVehicle: () => VehicleInstance | null;
|
|
150
119
|
getAllVehicles: () => VehicleInstance[];
|
|
151
|
-
switchPlayerModel: (model:
|
|
152
|
-
setMouseSensitivity: (mouseSensity: number) => void;
|
|
153
|
-
setGravity: (gravity: number) => void;
|
|
154
|
-
setJumpHeight: (jumpHeight: number) => void;
|
|
155
|
-
setPlayerSpeed: (playerSpeed: number) => void;
|
|
156
|
-
setPlayerFlySpeed: (playerFlySpeed: number) => void;
|
|
157
|
-
setMinCamDistance: (minCamDistance: number) => void;
|
|
158
|
-
setMaxCamDistance: (maxCamDistance: number) => void;
|
|
159
|
-
setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
|
|
160
|
-
setEnableZoom: (enableZoom: boolean) => void;
|
|
161
|
-
setDebug: (debug: boolean) => void;
|
|
162
|
-
setOverShoulderView: (enable: boolean) => void;
|
|
120
|
+
switchPlayerModel: (model: PlayerModelOptions) => Promise<void>;
|
|
163
121
|
setPlayerScale: (scale: number) => void;
|
|
122
|
+
setMouseSensitivity: (v: number) => void;
|
|
123
|
+
setGravity: (v: number) => void;
|
|
124
|
+
setJumpHeight: (v: number) => void;
|
|
125
|
+
setPlayerSpeed: (v: number) => void;
|
|
126
|
+
setPlayerFlySpeed: (v: number) => void;
|
|
127
|
+
setMinCamDistance: (v: number) => void;
|
|
128
|
+
setMaxCamDistance: (v: number) => void;
|
|
129
|
+
setThirdMouseMode: (v: 0 | 1 | 2 | 3) => void;
|
|
130
|
+
setEnableZoom: (v: boolean) => void;
|
|
131
|
+
setDebug: (v: boolean) => void;
|
|
132
|
+
setOverShoulderView: (v: boolean) => void;
|
|
133
|
+
registerAnimation: (key: string, clipName: string, opts?: {
|
|
134
|
+
loop?: boolean;
|
|
135
|
+
timeScale?: number;
|
|
136
|
+
clampWhenFinished?: boolean;
|
|
137
|
+
onFinished?: () => void;
|
|
138
|
+
}) => void;
|
|
139
|
+
playAnimation: (key: string, opts?: {
|
|
140
|
+
fade?: number;
|
|
141
|
+
force?: boolean;
|
|
142
|
+
}) => void;
|
|
164
143
|
};
|
|
165
144
|
type playerController = ReturnType<typeof playerController>;
|
|
166
145
|
declare function onAllEvent(): void;
|
|
167
146
|
declare function offAllEvent(): void;
|
|
168
147
|
|
|
169
|
-
export { type PlayerControllerOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
|
|
148
|
+
export { type PlayerControllerOptions, type PlayerModelOptions, type VehicleInstance, type VehicleOptions, offAllEvent, onAllEvent, playerController };
|