three-player-controller 0.3.2 → 0.3.4

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
@@ -69,10 +69,15 @@ player.update();
69
69
  ```ts
70
70
  export function playerController(): {
71
71
  init: (opts: PlayerControllerOptions, callback?: () => void) => void;
72
+ loadVehicleModel: (params: vehicleOptions) => void;
72
73
  changeView: () => void;
73
74
  reset: (pos?: THREE.Vector3) => void;
74
75
  update: (dt?: number) => void;
75
76
  destroy: () => void;
77
+ getposition: () => THREE.Vector3;
78
+ getPerson: () => THREE.Object3D | null;
79
+ getActiveVehicle: () => VehicleInstance | null;
80
+ getAllVehicles: () => VehicleInstance[];
76
81
  };
77
82
  ```
78
83
 
@@ -80,6 +85,8 @@ export function playerController(): {
80
85
 
81
86
  - `init(opts, callback?)`
82
87
  初始化控制器。`callback` 在资源加载完成后调用。
88
+ - `loadVehicleModel(params?)`
89
+ 初始化车辆。
83
90
  - `changeView()`
84
91
  在第一/第三人称间切换。
85
92
  - `reset(pos?)`
@@ -88,6 +95,14 @@ export function playerController(): {
88
95
  每帧调用。
89
96
  - `destroy()`
90
97
  销毁控制器。
98
+ - `getposition()`
99
+ 获取人物当前位置。
100
+ - `getPerson()`
101
+ 获取人物模型。
102
+ - `getActiveVehicle()`
103
+ 获取当前车辆实例。
104
+ - `getAllVehicles()`
105
+ 获取所有车辆实例。。
91
106
 
92
107
  ---
93
108
 
@@ -111,7 +126,7 @@ export function offAllEvent(): void; // 关闭所有输入事件
111
126
 
112
127
  ## 三、配置与参数说明
113
128
 
114
- ### 类型定义
129
+ ### 人物类型定义
115
130
 
116
131
  ```ts
117
132
  type PlayerControllerOptions = {
@@ -139,6 +154,9 @@ type PlayerControllerOptions = {
139
154
  minCamDistance?: number;
140
155
  maxCamDistance?: number;
141
156
  colliderMeshUrl?: string;
157
+ isShowMobileControls?: boolean;
158
+ thirdMouseMode?: number;
159
+ enableZoom?: boolean;
142
160
  };
143
161
  ```
144
162
 
@@ -152,6 +170,9 @@ type PlayerControllerOptions = {
152
170
  | `playerModel.url` | `string` | 人物模型路径(GLB/GLTF,必填) |
153
171
  | `playerModel.scale` | `number` | 人物模型缩放(必填) |
154
172
  | `playerModel.idleAnim` / `walkAnim` / `runAnim` / `jumpAnim` | `string` | 人物动画名,需与人物模型中动画名称一致(必填) |
173
+ | `playerModel.enterCarAnim` / `exitCarAnim` | `string` | 上车/下车动画名(可选) |
174
+ | `playerModel.rotateY` | `number` | 模型绕 Y 轴的额外旋转偏移(可选) |
175
+ | `playerModel.headObjName` | `string` | 头部对象名称(用于相机绑定或查找头部节点)(可选) |
155
176
  | `playerModel.speed` | `number` | 基准速度,默认`400` |
156
177
  | `playerModel.gravity` | `number` | 重力加速度,默认`-2400` |
157
178
  | `playerModel.jumpHeight` | `number` | 跳跃高度,默认`800` |
@@ -161,6 +182,41 @@ type PlayerControllerOptions = {
161
182
  | `colliderMeshUrl` | `string` | 自制碰撞体模型路径,默认`""` |
162
183
  | `isShowMobileControls` | `boolean` | 移动端运行时,是否自动显示移动端控制器,默认`true` |
163
184
  | `thirdMouseMode` | `[0, 1, 2, 3]` | 第三人称视角下的不同鼠标控制模式 ,默认`1`(0: 隐藏鼠标控制朝向及视角,1: 隐藏鼠标仅控制视角,2: 显示鼠标拖拽控制朝向及视角, 3: 显示鼠标拖拽仅控制视角) |
185
+ | `enableZoom` | `boolean` | 第三人称模式下是否允许缩放,默认`false` |
186
+
187
+ ---
188
+
189
+ ### 车辆类型定义
190
+
191
+ ```ts
192
+ type vehicleOptions = {
193
+ url: string;
194
+ position: THREE.Vector3;
195
+ wheelsNames: string[];
196
+ scale?: number;
197
+ animations: {
198
+ openDoorAnim?: string;
199
+ };
200
+ boardingPoint: THREE.Vector3;
201
+ seatOffset?: THREE.Vector3;
202
+ chassisRatio?: number;
203
+ suspensionRestLengthRatio?: number;
204
+ };
205
+ ```
206
+
207
+ ### 关键字段说明
208
+
209
+ | 字段 | 类型 | 必填 | 默认 | 说明 |
210
+ | --------------------------- | --------------: | :--: | :------------------------: | ----------------------------------------------------------------------------------------- |
211
+ | `url` | `string` | 是 | — | 车辆模型路径(GLB/GLTF)。CORS。 |
212
+ | `position` | `THREE.Vector3` | 是 | — | 车辆在场景中的初始位置(世界坐标)。示例:`new THREE.Vector3(10,0,5)`。 |
213
+ | `wheelsNames` | `string[]` | 是 | — | 车辆模型中车轮节点的名称数组。顺序为前左、前右、后左、后右。 |
214
+ | `scale` | `number` | 否 | `1` | 模型缩放系数。 |
215
+ | `animations.openDoorAnim` | `string` | 否 | — | 打开车门的动画片段名称。 |
216
+ | `boardingPoint` | `THREE.Vector3` | 是 | — | 上车点 **局部坐标**(相对于车辆模型的本地坐标)。例:`new THREE.Vector3(0.8,1.0,0)`。 |
217
+ | `seatOffset` | `THREE.Vector3` | 否 | `new THREE.Vector3(0,0,0)` | 从 `boardingPoint` 到玩家座位的位置偏移(局部坐标)。可用于微调人物进入车辆后的具体位置。 |
218
+ | `chassisRatio` | `number` | 否 | `0.2` | 观察车辆原始模型预估底盘高度相较于轮胎直径的比例系数填入(实际作用为调整车辆模型位置)。 |
219
+ | `suspensionRestLengthRatio` | `number` | 否 | `0.2` | 底盘高度相较于轮胎直径的比例系数,与`chassisRatio`不同, 直接影响实际碰撞的底盘高度 |
164
220
 
165
221
  ---
166
222
 
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,14 @@ 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;
23
84
  rotateY?: number;
85
+ headObjName?: string;
24
86
  };
25
87
  initPos?: THREE.Vector3;
26
88
  mouseSensity?: number;
@@ -29,28 +91,57 @@ type PlayerControllerOptions = {
29
91
  colliderMeshUrl?: string;
30
92
  isShowMobileControls?: boolean;
31
93
  thirdMouseMode?: 0 | 1 | 2 | 3;
94
+ enableZoom?: boolean;
95
+ };
96
+ type vehicleOptions = {
97
+ url: string;
98
+ position: THREE.Vector3;
99
+ wheelsNames: string[];
100
+ scale?: number;
101
+ animations: {
102
+ openDoorAnim?: string;
103
+ };
104
+ boardingPoint: THREE.Vector3;
105
+ seatOffset?: THREE.Vector3;
106
+ chassisRatio?: number;
107
+ suspensionRestLengthRatio?: number;
108
+ };
109
+ type VehicleInstance = {
110
+ vehicleGroup: THREE.Group;
111
+ chassisBody: RigidBody;
112
+ vehicleController: any;
113
+ updateWheelVisuals: () => void;
114
+ vehicleMixer?: THREE.AnimationMixer;
115
+ vehicleActions?: Map<string, THREE.AnimationAction>;
116
+ vehiclIsOpenDoor: boolean;
117
+ vehicleBBox: THREE.Box3;
118
+ pathPlanner: PathPlanner;
119
+ scale: number;
120
+ boardingPoint: THREE.Vector3;
121
+ seatOffset: THREE.Vector3;
122
+ enterVehicleTime: number;
123
+ chassisRatio: number;
124
+ suspensionRestLengthRatio: number;
125
+ size: {
126
+ l: number;
127
+ w: number;
128
+ h: number;
129
+ };
32
130
  };
33
131
  declare function playerController(): {
34
132
  init: (opts: PlayerControllerOptions, callback?: () => void) => Promise<void>;
133
+ loadVehicleModel: (params: vehicleOptions) => Promise<void>;
35
134
  changeView: () => void;
36
135
  reset: (pos?: THREE.Vector3) => void;
37
136
  update: (dt?: number) => Promise<void>;
38
137
  destroy: () => void;
39
138
  setInput: (i: any) => void;
40
139
  getposition: () => THREE.Vector3;
41
- loadVehicleModel: (params: {
42
- url: string;
43
- position: THREE.Vector3;
44
- scale?: number;
45
- animations: {
46
- openDoorAnim?: string;
47
- wheelsTurnAnim?: string;
48
- turnLeftAnim?: string;
49
- turnRightAnim?: string;
50
- };
51
- }) => Promise<void>;
140
+ getPerson: () => THREE.Object3D<THREE.Object3DEventMap>;
141
+ getActiveVehicle: () => VehicleInstance;
142
+ getAllVehicles: () => VehicleInstance[];
52
143
  };
53
144
  declare function onAllEvent(): void;
54
145
  declare function offAllEvent(): void;
55
146
 
56
- export { type PlayerControllerOptions, offAllEvent, onAllEvent, playerController };
147
+ export { type PlayerControllerOptions, type VehicleInstance, offAllEvent, onAllEvent, playerController, type vehicleOptions };
package/dist/index.d.ts 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,14 @@ 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;
23
84
  rotateY?: number;
85
+ headObjName?: string;
24
86
  };
25
87
  initPos?: THREE.Vector3;
26
88
  mouseSensity?: number;
@@ -29,28 +91,57 @@ type PlayerControllerOptions = {
29
91
  colliderMeshUrl?: string;
30
92
  isShowMobileControls?: boolean;
31
93
  thirdMouseMode?: 0 | 1 | 2 | 3;
94
+ enableZoom?: boolean;
95
+ };
96
+ type vehicleOptions = {
97
+ url: string;
98
+ position: THREE.Vector3;
99
+ wheelsNames: string[];
100
+ scale?: number;
101
+ animations: {
102
+ openDoorAnim?: string;
103
+ };
104
+ boardingPoint: THREE.Vector3;
105
+ seatOffset?: THREE.Vector3;
106
+ chassisRatio?: number;
107
+ suspensionRestLengthRatio?: number;
108
+ };
109
+ type VehicleInstance = {
110
+ vehicleGroup: THREE.Group;
111
+ chassisBody: RigidBody;
112
+ vehicleController: any;
113
+ updateWheelVisuals: () => void;
114
+ vehicleMixer?: THREE.AnimationMixer;
115
+ vehicleActions?: Map<string, THREE.AnimationAction>;
116
+ vehiclIsOpenDoor: boolean;
117
+ vehicleBBox: THREE.Box3;
118
+ pathPlanner: PathPlanner;
119
+ scale: number;
120
+ boardingPoint: THREE.Vector3;
121
+ seatOffset: THREE.Vector3;
122
+ enterVehicleTime: number;
123
+ chassisRatio: number;
124
+ suspensionRestLengthRatio: number;
125
+ size: {
126
+ l: number;
127
+ w: number;
128
+ h: number;
129
+ };
32
130
  };
33
131
  declare function playerController(): {
34
132
  init: (opts: PlayerControllerOptions, callback?: () => void) => Promise<void>;
133
+ loadVehicleModel: (params: vehicleOptions) => Promise<void>;
35
134
  changeView: () => void;
36
135
  reset: (pos?: THREE.Vector3) => void;
37
136
  update: (dt?: number) => Promise<void>;
38
137
  destroy: () => void;
39
138
  setInput: (i: any) => void;
40
139
  getposition: () => THREE.Vector3;
41
- loadVehicleModel: (params: {
42
- url: string;
43
- position: THREE.Vector3;
44
- scale?: number;
45
- animations: {
46
- openDoorAnim?: string;
47
- wheelsTurnAnim?: string;
48
- turnLeftAnim?: string;
49
- turnRightAnim?: string;
50
- };
51
- }) => Promise<void>;
140
+ getPerson: () => THREE.Object3D<THREE.Object3DEventMap>;
141
+ getActiveVehicle: () => VehicleInstance;
142
+ getAllVehicles: () => VehicleInstance[];
52
143
  };
53
144
  declare function onAllEvent(): void;
54
145
  declare function offAllEvent(): void;
55
146
 
56
- export { type PlayerControllerOptions, offAllEvent, onAllEvent, playerController };
147
+ export { type PlayerControllerOptions, type VehicleInstance, offAllEvent, onAllEvent, playerController, type vehicleOptions };