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 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
- - [glb 场景](https://hh-hang.github.io/three-player-controller/index.html)
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
  ![飞行控制演示](https://github.com/hh-hang/three-player-controller/blob/master/example/public/gif/4.gif)
30
20
 
21
+ ### 车辆控制
22
+
23
+ ![车辆控制演示](https://github.com/hh-hang/three-player-controller/blob/master/example/public/gif/6.gif)
24
+
31
25
  ### 移动端控制演示
32
26
 
33
27
  ![移动端控制演示](https://github.com/hh-hang/three-player-controller/blob/master/example/public/gif/5.gif)
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: "Idle_2", // 默认 Idle 动画名字
52
- walkAnim: "Walking_11", // 默认 Walk 动画名字
53
- runAnim: "Running_9", // 默认 Run 动画名字
54
- jumpAnim: "Jump_3", // 默认 Jump 动画名字
79
+ scale: 0.001, // 模型缩放
80
+ idleAnim: "idle", // Idle 动画名
81
+ walkAnim: "walk", // Walk 动画名
82
+ runAnim: "run", // Run 动画名
83
+ jumpAnim: "jump", // Jump 动画名
55
84
  },
56
- initPos: pos, // 初始位置
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
- getposition: () => THREE.Vector3;
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
- - `init(opts, callback?)`
83
- 初始化控制器。`callback` 在资源加载完成后调用。
84
- - `changeView()`
85
- 在第一/第三人称间切换。
86
- - `reset(pos?)`
87
- 复位玩家到指定位置。
88
- - `update(dt?)`
89
- 每帧调用。
90
- - `destroy()`
91
- 销毁控制器。
92
- - `getposition()`
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()`:关闭输入监听(用于显示 UI 或暂停时禁止玩家输入)。
204
+ - `offAllEvent()`:关闭输入监听,用于显示 UI 或暂停时禁止玩家输入。
110
205
 
111
- 默认处理包括:WASD 移动、奔跑、跳跃、鼠标视角等。
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
- scale: number;
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?: number;
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
- | `scene` | `THREE.Scene` | three.js 场景(必填) |
156
- | `camera` | `THREE.PerspectiveCamera` | three.js 相机(必填) |
157
- | `controls` | `OrbitControls` | 外部相机控制器(必填) |
158
- | `playerModel.url` | `string` | 人物模型路径(GLB/GLTF,必填) |
159
- | `playerModel.scale` | `number` | 人物模型缩放(必填) |
160
- | `playerModel.idleAnim` / `walkAnim` / `runAnim` / `jumpAnim` | `string` | 人物动画名,需与人物模型中动画名称一致(必填) |
161
- | `playerModel.speed` | `number` | 基准速度,默认`400` |
162
- | `playerModel.gravity` | `number` | 重力加速度,默认`-2400` |
163
- | `playerModel.jumpHeight` | `number` | 跳跃高度,默认`800` |
164
- | `initPos` | `THREE.Vector3` | 初始位置,默认`(0,0,0)` |
165
- | `mouseSensity` | `number` | 鼠标灵敏度,默认`5` |
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
- getposition: () => THREE.Vector3;
42
- loadVehicleModel: (params: {
43
- url: string;
44
- position: THREE.Vector3;
45
- scale?: number;
46
- animations: {
47
- openDoorAnim?: string;
48
- wheelsTurnAnim?: string;
49
- turnLeftAnim?: string;
50
- turnRightAnim?: string;
51
- };
52
- }) => Promise<void>;
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 };