forked from Rowland/EG
374 lines
7.4 KiB
Markdown
374 lines
7.4 KiB
Markdown
# VR + ALVR 串流实现指南
|
||
|
||
## 🎯 概述
|
||
|
||
本指南详细介绍了如何在Panda3D引擎中实现VR支持,并通过ALVR串流到Quest等VR头显设备。
|
||
|
||
## 🏗️ 系统架构
|
||
|
||
### 核心组件
|
||
|
||
1. **VRManager** (`core/vr_manager.py`)
|
||
- 负责VR系统初始化
|
||
- 管理立体渲染(左右眼)
|
||
- 处理VR设备跟踪
|
||
- 集成OpenVR接口
|
||
|
||
2. **VRInputHandler** (`core/vr_input_handler.py`)
|
||
- 处理VR控制器输入
|
||
- 手势识别系统
|
||
- 交互逻辑处理
|
||
|
||
3. **ALVRStreamer** (`core/alvr_streamer.py`)
|
||
- ALVR服务器通信
|
||
- 视频流编码和传输
|
||
- 性能监控
|
||
|
||
4. **VRControlPanel** (`ui/vr_control_panel.py`)
|
||
- VR系统GUI控制界面
|
||
- 实时状态监控
|
||
- 参数调整面板
|
||
|
||
## 🔧 安装和配置
|
||
|
||
### 1. 系统依赖
|
||
|
||
```bash
|
||
# 安装Python依赖
|
||
pip install -r requirements/vr-requirements.txt
|
||
|
||
# 安装OpenVR运行时
|
||
# Windows: 下载并安装SteamVR
|
||
# Linux:
|
||
sudo apt-get install steam
|
||
# 然后在Steam中安装SteamVR
|
||
```
|
||
|
||
### 2. ALVR服务器设置
|
||
|
||
```bash
|
||
# 下载ALVR服务器
|
||
# 从 https://github.com/alvr-org/ALVR 下载最新版本
|
||
|
||
# Windows
|
||
# 1. 解压到 C:\ALVR\
|
||
# 2. 运行 alvr_server.exe
|
||
|
||
# Linux
|
||
# 1. 解压到 /usr/local/bin/
|
||
# 2. 运行 alvr_server
|
||
```
|
||
|
||
### 3. Quest设备配置
|
||
|
||
```bash
|
||
# 1. 在Quest上安装ALVR客户端
|
||
# 2. 启用开发者模式
|
||
# 3. 连接到同一WiFi网络
|
||
# 4. 配置防火墙允许ALVR通信(端口9943-9944)
|
||
```
|
||
|
||
## 🚀 使用方法
|
||
|
||
### 快速启动
|
||
|
||
```python
|
||
# 在主程序中
|
||
world = MyWorld()
|
||
|
||
# 一键启用VR模式
|
||
if world.enableVRMode():
|
||
print("VR模式已启用")
|
||
|
||
# 检查VR状态
|
||
status = world.getVRStatus()
|
||
print(f"VR设备: {status['vr_info']}")
|
||
print(f"ALVR连接: {status['alvr_connected']}")
|
||
print(f"串流状态: {status['alvr_streaming']}")
|
||
```
|
||
|
||
### 详细控制
|
||
|
||
```python
|
||
# 分步骤启动VR
|
||
world = MyWorld()
|
||
|
||
# 1. 初始化VR系统
|
||
if world.initializeVR():
|
||
print("VR系统初始化成功")
|
||
|
||
# 2. 启动VR输入处理
|
||
world.startVRInput()
|
||
|
||
# 3. 显示控制器射线
|
||
world.showControllerRays(True)
|
||
|
||
# 4. 初始化ALVR串流
|
||
if world.initializeALVR():
|
||
print("ALVR初始化成功")
|
||
|
||
# 5. 设置串流质量
|
||
world.setALVRStreamQuality(
|
||
width=2880,
|
||
height=1700,
|
||
fps=72,
|
||
bitrate=150
|
||
)
|
||
|
||
# 6. 开始串流
|
||
world.startALVRStreaming()
|
||
```
|
||
|
||
### GUI控制界面
|
||
|
||
```python
|
||
# 创建VR控制面板
|
||
from ui.vr_control_panel import VRControlPanel
|
||
|
||
vr_panel = VRControlPanel(world)
|
||
vr_panel.show()
|
||
|
||
# 面板功能:
|
||
# - 一键启用/禁用VR
|
||
# - ALVR串流控制
|
||
# - 质量参数调整
|
||
# - 实时性能监控
|
||
# - 控制器状态显示
|
||
```
|
||
|
||
## 🎮 VR交互功能
|
||
|
||
### 控制器输入处理
|
||
|
||
```python
|
||
# 获取控制器状态
|
||
controllers = world.getAllControllers()
|
||
for controller_id in controllers:
|
||
state = world.getControllerState(controller_id)
|
||
|
||
# 检查扳机按下
|
||
if state['trigger'] > 0.5:
|
||
print(f"控制器 {controller_id} 扳机按下")
|
||
|
||
# 检查触摸板输入
|
||
touchpad_x, touchpad_y = state['touchpad']
|
||
if abs(touchpad_x) > 0.5:
|
||
print(f"触摸板水平滑动: {touchpad_x}")
|
||
```
|
||
|
||
### 对象抓取和操作
|
||
|
||
```python
|
||
# VR输入处理器自动处理对象抓取
|
||
# 扳机按下时自动检测和抓取对象
|
||
# 扳机释放时自动释放对象
|
||
|
||
# 监听VR事件
|
||
world.event_handler.accept('vr-object-grabbed', onObjectGrabbed)
|
||
world.event_handler.accept('vr-object-released', onObjectReleased)
|
||
|
||
def onObjectGrabbed(object_node, controller_id):
|
||
print(f"抓取对象: {object_node.getName()}")
|
||
|
||
def onObjectReleased(object_node, controller_id):
|
||
print(f"释放对象: {object_node.getName()}")
|
||
```
|
||
|
||
### 触觉反馈
|
||
|
||
```python
|
||
# 发送触觉反馈
|
||
world.sendHapticFeedback(
|
||
controller_id=0,
|
||
duration=0.5, # 持续时间(秒)
|
||
intensity=0.8 # 强度(0-1)
|
||
)
|
||
```
|
||
|
||
## 📊 性能优化
|
||
|
||
### 渲染优化
|
||
|
||
```python
|
||
# 调整VR渲染质量
|
||
vr_manager = world.vr_manager
|
||
vr_manager.render_scale = 1.0 # 渲染缩放 (0.5-2.0)
|
||
|
||
# 设置多重采样抗锯齿
|
||
fb_props = FrameBufferProperties()
|
||
fb_props.setMultisamples(4) # 4x MSAA
|
||
```
|
||
|
||
### 网络优化
|
||
|
||
```python
|
||
# 优化ALVR串流参数
|
||
world.setALVRStreamQuality(
|
||
width=2160, # 降低分辨率提高性能
|
||
height=1200,
|
||
fps=60, # 降低帧率减少延迟
|
||
bitrate=100 # 降低比特率适应网络带宽
|
||
)
|
||
```
|
||
|
||
### 系统资源监控
|
||
|
||
```python
|
||
# 获取性能状态
|
||
streaming_status = world.getALVRStreamingStatus()
|
||
print(f"串流FPS: {streaming_status['fps']}")
|
||
print(f"延迟: {streaming_status['latency']} ms")
|
||
print(f"分辨率: {streaming_status['resolution']}")
|
||
```
|
||
|
||
## 🔍 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **VR系统初始化失败**
|
||
```
|
||
错误: OpenVR初始化失败
|
||
解决: 确保SteamVR已安装并运行
|
||
```
|
||
|
||
2. **ALVR连接失败**
|
||
```
|
||
错误: 无法连接到ALVR服务器
|
||
解决:
|
||
- 检查ALVR服务器是否运行
|
||
- 确认防火墙设置
|
||
- 检查网络连接
|
||
```
|
||
|
||
3. **串流质量问题**
|
||
```
|
||
问题: 画面卡顿或延迟高
|
||
解决:
|
||
- 降低分辨率和帧率
|
||
- 检查WiFi信号强度
|
||
- 调整比特率设置
|
||
```
|
||
|
||
### 调试命令
|
||
|
||
```python
|
||
# 启用调试模式
|
||
world.vr_manager.debug_mode = True
|
||
|
||
# 获取详细状态信息
|
||
vr_info = world.getVRInfo()
|
||
print(f"VR设备信息: {vr_info}")
|
||
|
||
# 检查网络连接
|
||
if world.isALVRConnected():
|
||
print("ALVR连接正常")
|
||
else:
|
||
print("ALVR连接失败")
|
||
```
|
||
|
||
## 🎯 高级功能
|
||
|
||
### 自定义VR交互
|
||
|
||
```python
|
||
# 创建自定义VR交互逻辑
|
||
class CustomVRInteraction:
|
||
def __init__(self, world):
|
||
self.world = world
|
||
|
||
def handleCustomGesture(self, gesture_data):
|
||
# 处理自定义手势
|
||
pass
|
||
|
||
def createVRMenu(self, controller_id):
|
||
# 在VR中创建3D菜单
|
||
pass
|
||
```
|
||
|
||
### 多用户VR支持
|
||
|
||
```python
|
||
# 支持多个VR用户
|
||
class MultiUserVRManager:
|
||
def __init__(self):
|
||
self.vr_users = {}
|
||
|
||
def addVRUser(self, user_id, vr_manager):
|
||
self.vr_users[user_id] = vr_manager
|
||
|
||
def syncVRUsers(self):
|
||
# 同步多用户VR状态
|
||
pass
|
||
```
|
||
|
||
## 📋 配置文件
|
||
|
||
### VR配置 (`config/vr_config.yaml`)
|
||
|
||
```yaml
|
||
vr:
|
||
enabled: true
|
||
render_scale: 1.0
|
||
tracking_space: "standing"
|
||
|
||
alvr:
|
||
server_ip: "127.0.0.1"
|
||
server_port: 9943
|
||
streaming_port: 9944
|
||
|
||
video:
|
||
width: 2880
|
||
height: 1700
|
||
fps: 72
|
||
bitrate: 150
|
||
codec: "h264"
|
||
|
||
audio:
|
||
enabled: true
|
||
sample_rate: 48000
|
||
channels: 2
|
||
```
|
||
|
||
## 🚀 部署建议
|
||
|
||
### 开发环境
|
||
|
||
```bash
|
||
# 创建VR开发环境
|
||
python -m venv vr_env
|
||
source vr_env/bin/activate
|
||
pip install -r requirements/vr-requirements.txt
|
||
|
||
# 启动开发服务器
|
||
python main.py --vr-mode
|
||
```
|
||
|
||
### 生产环境
|
||
|
||
```bash
|
||
# 优化生产部署
|
||
# 1. 使用专用VR计算机
|
||
# 2. 配置高性能网络
|
||
# 3. 启用GPU加速
|
||
# 4. 监控系统性能
|
||
```
|
||
|
||
## 📚 参考资料
|
||
|
||
- [OpenVR API文档](https://github.com/ValveSoftware/openvr/wiki/API-Documentation)
|
||
- [ALVR项目主页](https://github.com/alvr-org/ALVR)
|
||
- [Panda3D VR指南](https://docs.panda3d.org/1.10/python/programming/render-to-texture/index)
|
||
- [Quest开发者文档](https://developer.oculus.com/documentation/quest/)
|
||
|
||
## 🤝 贡献指南
|
||
|
||
欢迎贡献代码和改进建议!请遵循以下步骤:
|
||
|
||
1. Fork此仓库
|
||
2. 创建功能分支
|
||
3. 提交代码修改
|
||
4. 创建Pull Request
|
||
|
||
## 📄 许可证
|
||
|
||
本项目采用MIT许可证。详见LICENSE文件。 |