three-player-controller 0.3.5 → 0.3.7

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
@@ -148,7 +148,7 @@ export function playerController(): {
148
148
  setGravity: (gravity: number) => void;
149
149
  setJumpHeight: (jumpHeight: number) => void;
150
150
  setPlayerSpeed: (playerSpeed: number) => void;
151
- setPlayerFlySpeed: (playerFlySpeed: number) => void;
151
+ setflySpeed: (flySpeed: number) => void;
152
152
  setMinCamDistance: (minCamDistance: number) => void;
153
153
  setMaxCamDistance: (maxCamDistance: number) => void;
154
154
  setThirdMouseMode: (thirdMouseMode: 0 | 1 | 2 | 3) => void;
@@ -180,7 +180,7 @@ export function playerController(): {
180
180
  | `setGravity(v)` | 设置重力(传入基准值,内部自动乘以 scale) |
181
181
  | `setJumpHeight(v)` | 设置跳跃高度(传入基准值,内部自动乘以 scale) |
182
182
  | `setPlayerSpeed(v)` | 设置移动速度(传入基准值,内部自动乘以 scale) |
183
- | `setPlayerFlySpeed(v)` | 设置飞行速度(传入基准值,内部自动乘以 scale) |
183
+ | `setflySpeed(v)` | 设置飞行速度(传入基准值,内部自动乘以 scale) |
184
184
  | `setMinCamDistance(v)` | 设置第三人称最小相机距离 |
185
185
  | `setMaxCamDistance(v)` | 设置第三人称最大相机距离 |
186
186
  | `setThirdMouseMode(v)` | 设置第三人称鼠标模式(0~3) |
@@ -251,7 +251,7 @@ type PlayerControllerOptions = {
251
251
  gravity?: number;
252
252
  jumpHeight?: number;
253
253
  speed?: number;
254
- playerFlySpeed?: number;
254
+ flySpeed?: number;
255
255
  rotateY?: number;
256
256
  headObjName?: string;
257
257
  flyEnabled?: boolean;
@@ -270,32 +270,41 @@ type PlayerControllerOptions = {
270
270
 
271
271
  ### 关键字段说明
272
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` |
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` | `string` | | | Idle 动画名,需与模型内动画名一致 |
281
+ | `playerModel.walkAnim` | `string` | | | Walk 动画名,需与模型内动画名一致 |
282
+ | `playerModel.runAnim` | `string` | | | Run 动画名,需与模型内动画名一致 |
283
+ | `playerModel.jumpAnim` | `string` | | | Jump 动画名,需与模型内动画名一致 |
284
+ | `playerModel.leftWalkAnim` | `string` | | `walkAnim` | 左走动画名,不填则复用 `walkAnim` |
285
+ | `playerModel.rightWalkAnim` | `string` | | `walkAnim` | 右走动画名,不填则复用 `walkAnim` |
286
+ | `playerModel.backwardAnim` | `string` | | `walkAnim` | 后退动画名,不填则复用 `walkAnim` |
287
+ | `playerModel.flyAnim` | `string` | | `idleAnim` | 飞行动画名,不填则复用 `idleAnim` |
288
+ | `playerModel.flyIdleAnim` | `string` | | `idleAnim` | 飞行待机动画名,不填则复用 `idleAnim` |
289
+ | `playerModel.enterCarAnim` | `string` | | | 上车动画名(使用车辆功能时必填) |
290
+ | `playerModel.exitCarAnim` | `string` | | | 下车动画名(使用车辆功能时必填) |
291
+ | `playerModel.rotateY` | `number` | | `0` | 模型绕 Y 轴的额外旋转偏移 |
292
+ | `playerModel.headObjName` | `string` | | | 头部节点名称,用于第一人称相机绑定 |
293
+ | `playerModel.speed` | `number` | | `300` | 移动速度基准值 |
294
+ | `playerModel.gravity` | `number` | | `-2400` | 重力加速度基准值 |
295
+ | `playerModel.jumpHeight` | `number` | | `600` | 跳跃高度基准值 |
296
+ | `playerModel.flySpeed` | `number` | | `2100` | 飞行速度基准值 |
297
+ | `playerModel.flyEnabled` | `boolean` | | `true` | 是否允许飞行模式 |
298
+ | `initPos` | `THREE.Vector3` | | `(0,0,0)` | 初始位置 |
299
+ | `mouseSensity` | `number` | 否 | `5` | 鼠标灵敏度 |
300
+ | `minCamDistance` | `number` | 否 | `100` | 第三人称最小相机距离 |
301
+ | `maxCamDistance` | `number` | 否 | `440` | 第三人称最大相机距离 |
302
+ | `colliderMeshUrl` | `string` | 否 | — | 自定义碰撞体模型路径,默认使用场景中所有网格 |
303
+ | `isShowMobileControls` | `boolean` | 否 | `true` | 移动端是否自动显示虚拟摇杆 |
304
+ | `thirdMouseMode` | `0\|1\|2\|3` | 否 | `1` | 第三人称鼠标模式(见下表) |
305
+ | `enableZoom` | `boolean` | 否 | `false` | 第三人称是否允许滚轮缩放 |
306
+ | `enableOverShoulderView` | `boolean` | 否 | `false` | 是否开启过肩视角偏移 |
307
+ | `capsuleRadiusRatio` | `number` | 否 | `1.0` | 玩家胶囊碰撞体的半径系数,值越大碰撞范围越宽 |
299
308
 
300
309
  **thirdMouseMode 说明:**
301
310
 
package/dist/index.d.mts CHANGED
@@ -81,10 +81,11 @@ type PlayerControllerOptions = {
81
81
  gravity?: number;
82
82
  jumpHeight?: number;
83
83
  speed?: number;
84
- playerFlySpeed?: number;
84
+ flySpeed?: number;
85
85
  rotateY?: number;
86
86
  headObjName?: string;
87
87
  flyEnabled?: boolean;
88
+ capsuleRadiusRatio?: number;
88
89
  };
89
90
  initPos?: THREE.Vector3;
90
91
  mouseSensity?: number;
package/dist/index.d.ts CHANGED
@@ -81,10 +81,11 @@ type PlayerControllerOptions = {
81
81
  gravity?: number;
82
82
  jumpHeight?: number;
83
83
  speed?: number;
84
- playerFlySpeed?: number;
84
+ flySpeed?: number;
85
85
  rotateY?: number;
86
86
  headObjName?: string;
87
87
  flyEnabled?: boolean;
88
+ capsuleRadiusRatio?: number;
88
89
  };
89
90
  initPos?: THREE.Vector3;
90
91
  mouseSensity?: number;
package/dist/index.js CHANGED
@@ -337,8 +337,9 @@ var PlayerController = class {
337
337
  this.enableOverShoulderView = false;
338
338
  this.isChangeControllerTransitionTimer = null;
339
339
  // ==================== 玩家基本属性 ====================
340
- this.playerRadius = 45;
341
- this.playerHeight = 180;
340
+ this.playerCapsuleRadius = 45;
341
+ this.playerCapsuleRadiusRatio = 1;
342
+ this.playerCapsuleHeight = 180;
342
343
  // 玩家参考身高
343
344
  this.isFirstPerson = false;
344
345
  this.boundingBoxMinY = 0;
@@ -368,7 +369,7 @@ var PlayerController = class {
368
369
  // 全局车辆共享参数
369
370
  this.vehicleParams = {
370
371
  debug: {
371
- showPhysicsBox: true
372
+ showPhysicsBox: false
372
373
  },
373
374
  chassis: {
374
375
  linearDamping: 0.5,
@@ -714,7 +715,7 @@ var PlayerController = class {
714
715
  this.gravity = (opts.playerModel.gravity ?? -2400) * s;
715
716
  this.jumpHeight = (opts.playerModel.jumpHeight ?? 600) * s;
716
717
  this.playerSpeed = (opts.playerModel.speed ?? 300) * s;
717
- this.playerFlySpeed = (opts.playerModel.playerFlySpeed ?? 2100) * s;
718
+ this.playerFlySpeed = (opts.playerModel.flySpeed ?? 2100) * s;
718
719
  this.curPlayerSpeed = this.playerSpeed;
719
720
  this.playerModel.rotateY = opts.playerModel.rotateY ?? 0;
720
721
  this.playerFlyEnabled = opts.playerModel.flyEnabled ?? true;
@@ -725,6 +726,7 @@ var PlayerController = class {
725
726
  this.orginMaxCamDistance = this.maxCamDistance;
726
727
  this.thirdMouseMode = opts.thirdMouseMode ?? 1;
727
728
  this.enableZoom = opts.enableZoom ?? false;
729
+ this.playerCapsuleRadiusRatio = opts.playerModel.capsuleRadiusRatio ?? 1;
728
730
  const isMobileDevice = () => navigator.maxTouchPoints && navigator.maxTouchPoints > 0 || "ontouchstart" in window || /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
729
731
  this.isShowMobileControls = (opts.isShowMobileControls ?? true) && isMobileDevice();
730
732
  if (this.isShowMobileControls) {
@@ -805,11 +807,10 @@ var PlayerController = class {
805
807
  );
806
808
  this.person = gltf.scene;
807
809
  const { size } = this.getBbox(this.person);
808
- const ratio = this.playerHeight / size.y;
809
- const power = Math.round(Math.log10(ratio));
810
- const modelScale = Math.pow(10, power);
811
- this.playerRadius = Number(Math.min(size.x, size.z).toFixed(0)) * modelScale;
812
- this.playerHeight = Number(size.y.toFixed(0)) * modelScale;
810
+ const ratio = this.playerCapsuleHeight / size.y;
811
+ const modelScale = ratio;
812
+ this.playerCapsuleRadius = Number(Math.min(size.x, size.z).toFixed(0)) * modelScale * this.playerCapsuleRadiusRatio;
813
+ this.playerCapsuleHeight = Number(size.y.toFixed(0)) * modelScale;
813
814
  const scale = this.playerModel.scale;
814
815
  const material = new THREE3.MeshStandardMaterial({
815
816
  color: new THREE3.Color(1, 0, 0),
@@ -820,8 +821,8 @@ var PlayerController = class {
820
821
  wireframe: true,
821
822
  depthWrite: false
822
823
  });
823
- const r = this.playerRadius * scale;
824
- const h = this.playerHeight * scale;
824
+ const r = this.playerCapsuleRadius * scale;
825
+ const h = this.playerCapsuleHeight * scale;
825
826
  this.player = new THREE3.Mesh(
826
827
  new import_RoundedBoxGeometry.RoundedBoxGeometry(r * 2, h, r * 2, 1, 75),
827
828
  material
@@ -1009,8 +1010,7 @@ var PlayerController = class {
1009
1010
  const vehicleModel = await this.loader.loadAsync(opts.url);
1010
1011
  const { size: originalSize } = this.getBbox(vehicleModel.scene);
1011
1012
  const ratio = this.vehicleLength / Math.max(originalSize.x, originalSize.y, originalSize.z);
1012
- const power = Math.round(Math.log10(ratio));
1013
- const modelScale = Math.pow(10, power);
1013
+ const modelScale = ratio;
1014
1014
  const vehicleMixer = new THREE3.AnimationMixer(vehicleModel.scene);
1015
1015
  const animations = vehicleModel.animations ?? [];
1016
1016
  const vehicleActions = /* @__PURE__ */ new Map();
@@ -2166,9 +2166,9 @@ var PlayerController = class {
2166
2166
  );
2167
2167
  if (intersects.length > 0) {
2168
2168
  playerDistanceFromGround = this.player.position.y - intersects[0].point.y;
2169
- const maxH = this.playerHeight * this.playerModel.scale * 0.9;
2170
- const h = this.playerHeight * this.playerModel.scale * 0.75;
2171
- const minH = this.playerHeight * this.playerModel.scale * 0.7;
2169
+ const maxH = this.playerCapsuleHeight * this.playerModel.scale * 0.9;
2170
+ const h = this.playerCapsuleHeight * this.playerModel.scale * 0.75;
2171
+ const minH = this.playerCapsuleHeight * this.playerModel.scale * 0.7;
2172
2172
  if (!this.isFlying) {
2173
2173
  if (playerDistanceFromGround >= maxH) {
2174
2174
  this.playerVelocity.y += delta * this.gravity;
@@ -2316,7 +2316,7 @@ var PlayerController = class {
2316
2316
  }
2317
2317
  if (!this.isFirstPerson) {
2318
2318
  const lookTarget = this.player.position.clone();
2319
- lookTarget.y += this.playerHeight / 8 * this.playerModel.scale;
2319
+ lookTarget.y += this.playerCapsuleHeight / 8 * this.playerModel.scale;
2320
2320
  this.camera.position.sub(this.controls.target);
2321
2321
  this.controls.target.copy(lookTarget);
2322
2322
  this.camera.position.add(lookTarget);