/** * 角色控制器,轻量无插件、无物理引擎, 只在水平面运动 * 模型动作:idle、walking、running * 动作控制:wsad(移动)+shift(跑),+\-(移动速度) * zhu18 at 2025/03/27 */ import type { OrthographicCamera, Scene } from 'three'; import { Euler, EventDispatcher, Object3D, PerspectiveCamera, Vector3 } from 'three'; export interface ISpawnPoint { position?: Vector3; rotation?: Euler; } interface LimitOption { pitch?: [number, number]; yaw?: [number, number]; distance?: [number, number]; } /** * 角色控制器 * * @export * @class CharacterControls * @description three通用场景角色控制器 * @example * * let controller = new CharacterControls({ * scene, * camera, * domElement: document.body, * characterModelUrl: 'path/to/your/3d/model.glb', * spawnPoint: {// 可选, 出生点, 3D模型文件在场景中的初始位置 * position: new Vector3(0, 0, 0),// 位置 * rotation: new Euler(0, 0, 0)// 视角 * } * }); * */ export declare class CharacterControls extends EventDispatcher { scene: Scene; camera: PerspectiveCamera | OrthographicCamera; domElement: HTMLElement; spawnPoint: ISpawnPoint; characterModelUrl: string; character: Object3D | null; private mixer; private animations; private currentAction; private currentActionAnimate; private isJumping; private lastJumpTime; castShadow: boolean; private isFirstPerson; moveSpeed: number; private keys; private mousePosition; private targetRotation; private isMouseDown; private mouseSensitivity; private smoothFactor; private rotationSpeed; private minPolarAngle; private maxPolarAngle; private fadeDuration; minCameraDistance: number; maxCameraDistance: number; cameraDistance: number; cameraHeight: number; private currentRotation; private jumpHeight; private jumpSpeed; private jumpTime; private initialY; private _enabled; allowFly: boolean; maxMoveSpeed: number; minMoveSpeed: number; /** * 创建角色控制器 * @param scene threejs scene object * @param camera threejs scene camera * @param CharacterModelUrl Character model file url * @param spawnPoint 角色出生位置 */ constructor(options: { scene: Scene; camera: PerspectiveCamera | OrthographicCamera; domElement: HTMLElement; characterModelUrl: string; spawnPoint?: ISpawnPoint; limit: LimitOption; }); get enabled(): boolean; set enabled(value: boolean); get target(): Vector3 | undefined; set limit(options: LimitOption); /** * 切换第一/第三人称视角 */ toggleView(): void; /** * 设置角色控制器的视角模式 * @param isFirstPerson - 是否为第一人称模式。true表示第一人称,false表示第三人称 * @remarks * - 第一人称模式下:相机距离设为0.1,隐藏角色模型,相机位置调整到角色眼睛高度 * - 第三人称模式下:相机距离设为5,显示角色模型,相机位置调整到角色后方 */ setMode(isFirstPerson: boolean): void; private tempCameraPos; private hideCharacterModel; init(): void; private onContextMenu; private handleKeyDown; private handleKeyUp; private onMouseDown; private onMouseUp; private onMouseMove; private onTouchStart; private onTouchEnd; private handleResize; private onTouchMove; private rotateCamera; private playAnimation; private onWheel; private updateCamera; /** * 更新角色移动和动画状态 * * @param delta 可选的时间增量参数,用于帧率无关的更新 * @description * - 根据键盘输入计算移动向量 * - 处理角色移动逻辑(前进/后退/左移/右移) * - 更新角色朝向使其与移动方向一致 * - 根据移动状态切换行走/跑步动画 * - 无输入时播放待机动画 * - 包含被注释掉的跳跃功能实现 * @private 内部实现细节,不对外暴露 */ private updateCharacter; update(): void; dispose(): void; /** * 获取角色与指定点之间的距离 */ getDistance(target: Vector3): number; /** * 获取角色到目标点的方位角(水平角度) */ getAzimuthalAngle(): number; /** * 获取角色到目标点的极角(垂直角度) */ getPolarAngle(): number; } export {};