468 lines
15 KiB
Python
468 lines
15 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
VR功能测试脚本
|
||
测试VR系统的各种功能,包括模拟模式和真实VR模式
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
from main import MyWorld
|
||
|
||
def test_basic_vr_functionality():
|
||
"""测试基本VR功能"""
|
||
print("=== VR基本功能测试 ===")
|
||
|
||
# 创建世界实例
|
||
world = MyWorld()
|
||
|
||
# 检查VR管理器是否正确初始化
|
||
print("✓ VR管理器已创建")
|
||
|
||
# 检查OpenVR库是否可用
|
||
try:
|
||
import openvr
|
||
print("✓ OpenVR库已安装")
|
||
except ImportError:
|
||
print("⚠ OpenVR库未安装,将使用模拟模式")
|
||
|
||
# 测试VR初始化(会自动回退到模拟模式)
|
||
print("\n正在测试VR初始化...")
|
||
vr_success = world.initializeVR()
|
||
|
||
if vr_success:
|
||
print("✓ VR系统初始化成功")
|
||
|
||
# 获取VR信息
|
||
vr_info = world.getVRInfo()
|
||
print(f"\n📊 VR系统信息:")
|
||
print(f" - 模式: {vr_info['mode']}")
|
||
print(f" - 启用状态: {vr_info['enabled']}")
|
||
print(f" - 模拟模式: {vr_info['simulation_mode']}")
|
||
print(f" - 渲染尺寸: {vr_info['render_size']}")
|
||
print(f" - 控制器数量: {vr_info.get('controllers', 0)}")
|
||
|
||
# 测试控制器输入
|
||
print("\n🎮 测试控制器输入:")
|
||
for i in range(2):
|
||
controller_input = world.vr_manager.get_controller_input(i)
|
||
if controller_input and controller_input.get('connected'):
|
||
print(f" 控制器 {i}: 已连接")
|
||
print(f" - 扳机: {controller_input['trigger']:.2f}")
|
||
print(f" - 握把: {controller_input['grip']:.2f}")
|
||
print(f" - 触摸板: ({controller_input['touchpad']['x']:.2f}, {controller_input['touchpad']['y']:.2f})")
|
||
else:
|
||
print(f" 控制器 {i}: 未连接")
|
||
|
||
# 测试VR状态
|
||
print("\n📊 VR系统状态:")
|
||
status = world.getVRStatus()
|
||
print(f" - VR启用: {status['vr_enabled']}")
|
||
print(f" - 控制器总数: {len(status['controllers'])}")
|
||
|
||
else:
|
||
print("✗ VR系统初始化失败")
|
||
return False
|
||
|
||
# 关闭VR系统
|
||
world.shutdownVR()
|
||
print("\n✓ VR系统已关闭")
|
||
|
||
return True
|
||
|
||
def test_simulation_mode():
|
||
"""测试VR模拟模式"""
|
||
print("=== VR模拟模式测试 ===")
|
||
|
||
# 创建世界实例
|
||
world = MyWorld()
|
||
|
||
# 强制启用模拟模式
|
||
print("强制启用VR模拟模式...")
|
||
vr_success = world.vr_manager.enable_simulation_mode()
|
||
|
||
if vr_success:
|
||
print("✓ VR模拟模式启用成功")
|
||
|
||
# 获取模拟数据
|
||
sim_data = world.vr_manager.get_simulation_data()
|
||
if sim_data:
|
||
print(f"\n🎮 模拟数据:")
|
||
print(f" - 头部位置: {sim_data['head_pose']['position']}")
|
||
print(f" - 控制器 0 位置: {sim_data['controller_poses'][0]['position']}")
|
||
print(f" - 控制器 1 位置: {sim_data['controller_poses'][1]['position']}")
|
||
print(f" - 渲染尺寸: {sim_data['render_size']}")
|
||
|
||
# 测试更新模拟数据
|
||
print(f"\n🔧 测试模拟数据更新:")
|
||
new_head_pos = [0.1, 0.1, 1.7]
|
||
success = world.vr_manager.update_simulation_data('head_pose', {
|
||
'position': new_head_pos,
|
||
'rotation': [0, 0, 0, 1]
|
||
})
|
||
if success:
|
||
print(f" ✓ 头部位置更新为: {new_head_pos}")
|
||
|
||
# 测试控制器输入(模拟)
|
||
print(f"\n🎮 模拟控制器输入测试:")
|
||
for i in range(2):
|
||
controller_input = world.vr_manager.get_controller_input(i)
|
||
if controller_input:
|
||
print(f" 控制器 {i}:")
|
||
print(f" - 连接状态: {controller_input['connected']}")
|
||
print(f" - 扳机: {controller_input['trigger']}")
|
||
print(f" - 握把: {controller_input['grip']}")
|
||
print(f" - 菜单键: {controller_input['menu']}")
|
||
|
||
else:
|
||
print("✗ VR模拟模式启用失败")
|
||
return False
|
||
|
||
# 关闭VR系统
|
||
world.vr_manager.shutdown_vr()
|
||
print("\n✓ VR模拟模式已关闭")
|
||
|
||
return True
|
||
|
||
def test_alvr_streaming():
|
||
"""测试ALVR串流功能"""
|
||
print("=== ALVR串流测试 ===")
|
||
|
||
# 创建世界实例
|
||
world = MyWorld()
|
||
|
||
# 初始化VR系统
|
||
print("初始化VR系统...")
|
||
if not world.initializeVR():
|
||
print("✗ VR系统初始化失败")
|
||
return False
|
||
|
||
# 测试ALVR初始化
|
||
print("\n正在测试ALVR初始化...")
|
||
alvr_success = world.initializeALVR()
|
||
|
||
if alvr_success:
|
||
print("✓ ALVR初始化成功")
|
||
|
||
# 测试串流状态
|
||
print("\n📊 ALVR串流状态:")
|
||
status = world.getALVRStreamingStatus()
|
||
print(f" - 连接状态: {world.isALVRConnected()}")
|
||
print(f" - 串流状态: {world.isALVRStreaming()}")
|
||
|
||
# 测试串流质量设置
|
||
print("\n🎥 测试串流质量设置:")
|
||
quality_success = world.setALVRStreamQuality(1920, 1080, 60, 100)
|
||
if quality_success:
|
||
print(" ✓ 串流质量设置成功: 1920x1080@60fps, 100Mbps")
|
||
else:
|
||
print(" ⚠ 串流质量设置失败")
|
||
|
||
# 测试触觉反馈
|
||
print("\n🔔 测试触觉反馈:")
|
||
for controller_id in range(2):
|
||
feedback_success = world.sendHapticFeedback(controller_id, 0.1, 0.5)
|
||
if feedback_success:
|
||
print(f" ✓ 控制器 {controller_id} 触觉反馈发送成功")
|
||
else:
|
||
print(f" ⚠ 控制器 {controller_id} 触觉反馈发送失败")
|
||
|
||
# 测试串流控制
|
||
print("\n🎮 测试串流控制:")
|
||
start_success = world.startALVRStreaming()
|
||
if start_success:
|
||
print(" ✓ 串流开始成功")
|
||
else:
|
||
print(" ⚠ 串流开始失败")
|
||
|
||
# 等待一下然后停止
|
||
import time
|
||
time.sleep(1)
|
||
|
||
stop_success = world.stopALVRStreaming()
|
||
if stop_success:
|
||
print(" ✓ 串流停止成功")
|
||
else:
|
||
print(" ⚠ 串流停止失败")
|
||
|
||
else:
|
||
print("⚠ ALVR初始化失败(这在没有ALVR服务器时是正常的)")
|
||
print(" 提示: 要使用ALVR功能,请:")
|
||
print(" 1. 下载并安装ALVR服务器")
|
||
print(" 2. 启动ALVR服务器")
|
||
print(" 3. 在Quest头盔上安装并启动ALVR客户端")
|
||
|
||
# 关闭系统
|
||
world.shutdownALVR()
|
||
world.shutdownVR()
|
||
print("\n✓ ALVR和VR系统已关闭")
|
||
|
||
return True
|
||
|
||
def test_vr_gui_control_panel():
|
||
"""测试VR GUI控制面板"""
|
||
print("=== VR GUI控制面板测试 ===")
|
||
|
||
try:
|
||
from ui.vr_control_panel import VRControlPanel
|
||
from PyQt5.QtWidgets import QApplication
|
||
|
||
# 创建Qt应用程序
|
||
app = QApplication.instance()
|
||
if app is None:
|
||
app = QApplication(sys.argv)
|
||
|
||
# 创建世界实例
|
||
world = MyWorld()
|
||
|
||
# 创建VR控制面板
|
||
print("创建VR控制面板...")
|
||
control_panel = VRControlPanel(world)
|
||
|
||
# 测试面板功能
|
||
print("✓ VR控制面板创建成功")
|
||
print(" - 面板标题:", control_panel.windowTitle())
|
||
print(" - 面板大小:", control_panel.size().width(), "x", control_panel.size().height())
|
||
|
||
# 显示面板(非阻塞)
|
||
control_panel.show()
|
||
print("✓ VR控制面板已显示")
|
||
|
||
print("\n💡 GUI控制面板功能:")
|
||
print(" - VR系统开关控制")
|
||
print(" - ALVR串流控制")
|
||
print(" - 实时状态监控")
|
||
print(" - 质量设置调整")
|
||
print(" - 控制器状态显示")
|
||
print(" - 性能监控")
|
||
|
||
# 短暂显示然后关闭
|
||
import time
|
||
time.sleep(2)
|
||
control_panel.close()
|
||
|
||
print("\n✓ VR控制面板测试完成")
|
||
|
||
except Exception as e:
|
||
print(f"✗ VR控制面板测试失败: {str(e)}")
|
||
return False
|
||
|
||
return True
|
||
|
||
def test_vr_interaction():
|
||
"""测试VR交互功能"""
|
||
print("=== VR交互功能测试 ===")
|
||
|
||
# 创建世界实例
|
||
world = MyWorld()
|
||
|
||
# 初始化VR系统
|
||
print("初始化VR系统...")
|
||
if not world.initializeVR():
|
||
print("✗ VR系统初始化失败")
|
||
return False
|
||
|
||
# 测试VR输入处理
|
||
print("\n🎮 测试VR输入处理:")
|
||
input_success = world.startVRInput()
|
||
if input_success:
|
||
print(" ✓ VR输入处理启动成功")
|
||
|
||
# 测试控制器射线显示
|
||
print("\n🌟 测试控制器射线:")
|
||
ray_success = world.showControllerRays(True)
|
||
if ray_success:
|
||
print(" ✓ 控制器射线显示启用")
|
||
else:
|
||
print(" ⚠ 控制器射线显示失败")
|
||
|
||
# 测试手势识别
|
||
print("\n✋ 测试手势识别:")
|
||
gesture_success = world.setVRGestureEnabled(True)
|
||
if gesture_success:
|
||
print(" ✓ VR手势识别启用")
|
||
else:
|
||
print(" ⚠ VR手势识别启用失败")
|
||
|
||
# 测试VR交互
|
||
print("\n🤏 测试VR交互:")
|
||
interaction_success = world.setVRInteractionEnabled(True)
|
||
if interaction_success:
|
||
print(" ✓ VR交互功能启用")
|
||
else:
|
||
print(" ⚠ VR交互功能启用失败")
|
||
|
||
# 获取控制器状态
|
||
print("\n🎮 控制器状态:")
|
||
controllers = world.getAllControllers()
|
||
for i, controller in enumerate(controllers):
|
||
if controller:
|
||
print(f" 控制器 {i}: 可用")
|
||
state = world.getControllerState(i)
|
||
if state:
|
||
print(f" - 位置: {state.get('position', 'N/A')}")
|
||
print(f" - 旋转: {state.get('rotation', 'N/A')}")
|
||
print(f" - 按钮: {state.get('buttons', 'N/A')}")
|
||
else:
|
||
print(f" 控制器 {i}: 不可用")
|
||
|
||
# 停止VR输入
|
||
world.stopVRInput()
|
||
print("\n✓ VR输入处理已停止")
|
||
|
||
else:
|
||
print(" ⚠ VR输入处理启动失败")
|
||
|
||
# 关闭VR系统
|
||
world.shutdownVR()
|
||
print("\n✓ VR系统已关闭")
|
||
|
||
return True
|
||
|
||
def run_all_tests():
|
||
"""运行所有测试"""
|
||
print("=== 运行所有VR测试 ===")
|
||
|
||
tests = [
|
||
("基本VR功能", test_basic_vr_functionality),
|
||
("VR模拟模式", test_simulation_mode),
|
||
("ALVR串流", test_alvr_streaming),
|
||
("VR GUI控制面板", test_vr_gui_control_panel),
|
||
("VR交互功能", test_vr_interaction)
|
||
]
|
||
|
||
results = []
|
||
for test_name, test_func in tests:
|
||
print(f"\n{'='*50}")
|
||
print(f"正在运行: {test_name}")
|
||
print('='*50)
|
||
|
||
try:
|
||
success = test_func()
|
||
results.append((test_name, success))
|
||
if success:
|
||
print(f"✓ {test_name} 测试通过")
|
||
else:
|
||
print(f"✗ {test_name} 测试失败")
|
||
except Exception as e:
|
||
print(f"✗ {test_name} 测试出错: {str(e)}")
|
||
results.append((test_name, False))
|
||
|
||
# 打印总结
|
||
print(f"\n{'='*50}")
|
||
print("测试总结")
|
||
print('='*50)
|
||
|
||
passed = sum(1 for _, success in results if success)
|
||
total = len(results)
|
||
|
||
for test_name, success in results:
|
||
status = "✓ 通过" if success else "✗ 失败"
|
||
print(f"{test_name}: {status}")
|
||
|
||
print(f"\n总计: {passed}/{total} 个测试通过")
|
||
|
||
if passed == total:
|
||
print("🎉 所有测试都通过了!")
|
||
else:
|
||
print("⚠ 部分测试失败,请检查上述输出")
|
||
|
||
return passed == total
|
||
|
||
def print_vr_requirements():
|
||
"""打印VR系统要求"""
|
||
print("📋 VR系统要求说明")
|
||
print("="*50)
|
||
print("🔧 软件要求:")
|
||
print(" - Python 3.8+")
|
||
print(" - Panda3D")
|
||
print(" - PyQt5")
|
||
print(" - OpenVR库 (pip install openvr)")
|
||
print(" - 其他依赖见 requirements/vr-requirements.txt")
|
||
|
||
print("\n🎮 硬件要求(完整VR模式):")
|
||
print(" - 支持VR的显卡 (GTX 1060/RX 580 或更好)")
|
||
print(" - VR头盔 (Quest 2/3, Valve Index, HTC Vive等)")
|
||
print(" - 足够的USB端口或无线连接")
|
||
|
||
print("\n🌐 连接方式:")
|
||
print(" 有线连接:")
|
||
print(" - Valve Index: DisplayPort + USB 3.0")
|
||
print(" - HTC Vive: HDMI + USB 3.0")
|
||
print(" - Quest 2/3: USB-C (Quest Link)")
|
||
print(" 无线连接:")
|
||
print(" - Quest 2/3: 通过ALVR串流")
|
||
print(" - 需要5GHz Wi-Fi网络")
|
||
print(" - 需要ALVR服务器运行")
|
||
|
||
print("\n🔄 启动顺序(完整VR模式):")
|
||
print(" 1. 确保VR头盔已连接并识别")
|
||
print(" 2. 启动SteamVR")
|
||
print(" 3. (可选) 启动ALVR服务器(Quest无线)")
|
||
print(" 4. 运行VR测试脚本")
|
||
|
||
print("\n🎮 模拟模式说明:")
|
||
print(" - 无需VR硬件")
|
||
print(" - 模拟头盔和控制器追踪")
|
||
print(" - 立体渲染到窗口")
|
||
print(" - 适用于开发和调试")
|
||
|
||
print("\n💡 故障排除:")
|
||
print(" - 如果OpenVR初始化失败,系统会自动切换到模拟模式")
|
||
print(" - 检查SteamVR是否正在运行")
|
||
print(" - 确认VR头盔被系统识别")
|
||
print(" - 检查USB/DisplayPort连接")
|
||
print(" - 重启SteamVR和头盔")
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("🎮 VR功能测试脚本")
|
||
print("="*50)
|
||
|
||
# 显示要求说明
|
||
print_vr_requirements()
|
||
|
||
print("\n请选择测试类型:")
|
||
print("1. 基本VR功能测试")
|
||
print("2. VR模拟模式测试")
|
||
print("3. ALVR串流测试")
|
||
print("4. VR GUI控制面板")
|
||
print("5. VR交互功能测试")
|
||
print("6. 运行所有测试")
|
||
print("7. 查看VR系统要求")
|
||
|
||
try:
|
||
choice = input("请输入选择 (1-7): ")
|
||
|
||
if choice == "1":
|
||
success = test_basic_vr_functionality()
|
||
elif choice == "2":
|
||
success = test_simulation_mode()
|
||
elif choice == "3":
|
||
success = test_alvr_streaming()
|
||
elif choice == "4":
|
||
success = test_vr_gui_control_panel()
|
||
elif choice == "5":
|
||
success = test_vr_interaction()
|
||
elif choice == "6":
|
||
success = run_all_tests()
|
||
elif choice == "7":
|
||
print_vr_requirements()
|
||
return
|
||
else:
|
||
print("无效的选择")
|
||
return
|
||
|
||
print("\n" + "="*50)
|
||
if success:
|
||
print("✓ 测试成功")
|
||
else:
|
||
print("✗ 测试失败")
|
||
|
||
except KeyboardInterrupt:
|
||
print("\n用户中断测试")
|
||
except Exception as e:
|
||
print(f"测试过程中发生错误: {str(e)}")
|
||
|
||
if __name__ == "__main__":
|
||
main() |