""" VR摇杆配置模块 提供摇杆交互的配置选项和预设: - 不同的转向模式和灵敏度设置 - 传送参数调整 - 用户体验优化选项 """ from enum import Enum class TurnMode(Enum): """转向模式枚举""" SMOOTH = "smooth" # 平滑转向 SNAP = "snap" # 分段转向 class JoystickProfile(Enum): """摇杆配置预设""" COMFORTABLE = "comfortable" # 舒适模式 - 低灵敏度,平滑转向 STANDARD = "standard" # 标准模式 - 中等灵敏度,分段转向 GAMING = "gaming" # 游戏模式 - 高灵敏度,快速响应 ACCESSIBLE = "accessible" # 无障碍模式 - 更大死区,更高阈值 class VRJoystickConfig: """VR摇杆配置类""" def __init__(self): """初始化默认配置""" # 基础参数 self.deadzone = 0.15 # 摇杆死区 (0-1) self.turn_threshold = 0.3 # 转向激活阈值 self.teleport_threshold = 0.5 # 传送激活阈值 # 转向设置 self.turn_mode = TurnMode.SNAP # 转向模式 self.turn_sensitivity = 250.0 # 转向灵敏度(度/秒)- 增加速度 self.snap_turn_angle = 30.0 # 分段转向角度(度) self.snap_turn_cooldown = 0.3 # 分段转向间隔(秒) # 传送设置 self.teleport_range = 20.0 # 最大传送距离 self.teleport_arc_resolution = 50 # 抛物线精度 self.teleport_initial_velocity = 10.0 # 传送初始速度 self.min_teleport_distance = 1.0 # 最小传送距离 # 反馈设置 self.haptic_feedback_enabled = True # 是否启用震动反馈 self.teleport_start_haptic = (0.002, 0.3) # 传送开始震动 (时长, 强度) self.teleport_success_haptic = (0.005, 0.8) # 传送成功震动 self.teleport_fail_haptic = (0.001, 0.2) # 传送失败震动 # 可视化设置 self.show_teleport_arc = True # 显示传送抛物线 self.show_teleport_target = True # 显示传送目标标记 self.arc_valid_color = (0.2, 0.9, 0.2, 0.8) # 有效抛物线颜色 self.arc_invalid_color = (0.9, 0.2, 0.2, 0.8) # 无效抛物线颜色 def apply_profile(self, profile: JoystickProfile): """应用预设配置 Args: profile: 配置预设 """ if profile == JoystickProfile.COMFORTABLE: self._apply_comfortable_profile() elif profile == JoystickProfile.STANDARD: self._apply_standard_profile() elif profile == JoystickProfile.GAMING: self._apply_gaming_profile() elif profile == JoystickProfile.ACCESSIBLE: self._apply_accessible_profile() def _apply_comfortable_profile(self): """舒适模式 - 适合长时间使用""" self.deadzone = 0.2 self.turn_threshold = 0.4 self.teleport_threshold = 0.6 self.turn_mode = TurnMode.SMOOTH self.turn_sensitivity = 100.0 # 适中的转向速度 self.snap_turn_cooldown = 0.4 print("✓ 已应用舒适模式配置") def _apply_standard_profile(self): """标准模式 - 平衡的体验""" self.deadzone = 0.15 self.turn_threshold = 0.3 self.teleport_threshold = 0.5 self.turn_mode = TurnMode.SNAP self.turn_sensitivity = 150.0 # 更快的转向速度 self.snap_turn_angle = 30.0 self.snap_turn_cooldown = 0.3 print("✓ 已应用标准模式配置") def _apply_gaming_profile(self): """游戏模式 - 快速响应""" self.deadzone = 0.1 self.turn_threshold = 0.2 self.teleport_threshold = 0.4 self.turn_mode = TurnMode.SMOOTH self.turn_sensitivity = 200.0 # 高速转向 self.snap_turn_cooldown = 0.2 print("✓ 已应用游戏模式配置") def _apply_accessible_profile(self): """无障碍模式 - 更容易控制""" self.deadzone = 0.25 self.turn_threshold = 0.5 self.teleport_threshold = 0.7 self.turn_mode = TurnMode.SNAP self.turn_sensitivity = 80.0 # 较慢但可控的转向 self.snap_turn_angle = 45.0 self.snap_turn_cooldown = 0.5 print("✓ 已应用无障碍模式配置") def set_turn_mode(self, mode: TurnMode): """设置转向模式 Args: mode: 转向模式 """ self.turn_mode = mode print(f"✓ 转向模式设置为: {mode.value}") def set_turn_sensitivity(self, sensitivity: float): """设置转向灵敏度 Args: sensitivity: 转向灵敏度(度/秒) """ self.turn_sensitivity = max(10.0, min(180.0, sensitivity)) print(f"✓ 转向灵敏度设置为: {self.turn_sensitivity}度/秒") def set_deadzone(self, deadzone: float): """设置摇杆死区 Args: deadzone: 死区大小 (0-1) """ self.deadzone = max(0.0, min(0.5, deadzone)) print(f"✓ 摇杆死区设置为: {self.deadzone}") def set_teleport_range(self, range_meters: float): """设置传送范围 Args: range_meters: 传送范围(米) """ self.teleport_range = max(5.0, min(50.0, range_meters)) print(f"✓ 传送范围设置为: {self.teleport_range}米") def enable_haptic_feedback(self, enabled: bool): """启用或禁用震动反馈 Args: enabled: 是否启用 """ self.haptic_feedback_enabled = enabled print(f"✓ 震动反馈: {'启用' if enabled else '禁用'}") def get_config_dict(self): """获取配置字典 Returns: dict: 配置参数字典 """ return { 'deadzone': self.deadzone, 'turn_threshold': self.turn_threshold, 'teleport_threshold': self.teleport_threshold, 'turn_mode': self.turn_mode.value, 'turn_sensitivity': self.turn_sensitivity, 'snap_turn_angle': self.snap_turn_angle, 'snap_turn_cooldown': self.snap_turn_cooldown, 'teleport_range': self.teleport_range, 'haptic_feedback_enabled': self.haptic_feedback_enabled } def apply_to_joystick_manager(self, joystick_manager): """将配置应用到摇杆管理器 Args: joystick_manager: VRJoystickManager实例 """ try: joystick_manager.deadzone = self.deadzone joystick_manager.turn_threshold = self.turn_threshold joystick_manager.teleport_threshold = self.teleport_threshold joystick_manager.turn_sensitivity = self.turn_sensitivity joystick_manager.smooth_turning = (self.turn_mode == TurnMode.SMOOTH) joystick_manager.snap_turn_angle = self.snap_turn_angle joystick_manager.snap_turn_cooldown = self.snap_turn_cooldown # 应用传送系统配置 if hasattr(joystick_manager, 'teleport_system') and joystick_manager.teleport_system: teleport_sys = joystick_manager.teleport_system teleport_sys.teleport_range = self.teleport_range teleport_sys.arc_resolution = self.teleport_arc_resolution teleport_sys.initial_velocity = self.teleport_initial_velocity teleport_sys.min_teleport_distance = self.min_teleport_distance print("✅ 配置已成功应用到摇杆管理器") except Exception as e: print(f"⚠️ 应用配置失败: {e}") # 预定义的配置实例 COMFORTABLE_CONFIG = VRJoystickConfig() COMFORTABLE_CONFIG.apply_profile(JoystickProfile.COMFORTABLE) STANDARD_CONFIG = VRJoystickConfig() STANDARD_CONFIG.apply_profile(JoystickProfile.STANDARD) GAMING_CONFIG = VRJoystickConfig() GAMING_CONFIG.apply_profile(JoystickProfile.GAMING) ACCESSIBLE_CONFIG = VRJoystickConfig() ACCESSIBLE_CONFIG.apply_profile(JoystickProfile.ACCESSIBLE) def create_custom_config(**kwargs): """创建自定义配置 Args: **kwargs: 配置参数 Returns: VRJoystickConfig: 自定义配置实例 """ config = VRJoystickConfig() for key, value in kwargs.items(): if hasattr(config, key): setattr(config, key, value) else: print(f"⚠️ 未知的配置参数: {key}") return config def print_usage_guide(): """打印使用指南""" print("🎮 ======= VR摇杆交互使用指南 =======") print() print("📋 基本操作:") print(" • 摇杆左右移动 → 转向(旋转视角)") print(" • 摇杆向前推 → 显示传送抛物线") print(" • 松开摇杆 → 执行传送到落点") print() print("⚙️ 配置选项:") print(" • 舒适模式 → 低灵敏度,适合长时间使用") print(" • 标准模式 → 平衡体验,推荐大多数用户") print(" • 游戏模式 → 高灵敏度,快速响应") print(" • 无障碍模式 → 更大死区,容易控制") print() print("🎯 使用建议:") print(" • 首次使用建议从标准模式开始") print(" • 根据个人喜好调整转向模式(平滑/分段)") print(" • 可以随时调整死区和灵敏度") print(" • 传送范围可根据场景大小调整") print() if __name__ == "__main__": print_usage_guide()