# 屏幕投影拾取系统使用说明 ## 🎯 **概述** 为了解决您遇到的射线检测问题(射线偏向屏幕中心),我们实现了一个新的**屏幕投影拾取系统**,它直接基于2D屏幕坐标进行对象选择,比传统的3D射线检测更准确、更直观。 ## 🚀 **新系统优势** ### ✅ **相比射线检测的优点** 1. **准确性高**:完全对应用户的视觉感受,点击哪里就选中哪里 2. **性能优秀**:不需要复杂的3D数学计算 3. **稳定可靠**:不会出现射线偏向屏幕中心的问题 4. **支持任意形状**:通过包围盒自动计算选择范围 ### ❌ **传统射线检测的问题** - 射线不是从相机发出,而是从近平面发出 - 在Qt嵌入环境中容易出现坐标系转换问题 - 微小的坐标偏移会导致射线方向计算错误 ## 🔧 **技术实现** ### **核心原理** 1. **3D到2D投影**:将对象的世界坐标投影到屏幕坐标 2. **距离计算**:计算鼠标点击位置与对象屏幕位置的2D距离 3. **智能选择**:基于距离和优先级选择最合适的对象 ### **关键特性** - **自动半径计算**:根据对象包围盒自动计算屏幕选择半径 - **优先级系统**:支持不同类型对象的选择优先级 - **容差调节**:可调节选择容差,使选择更容易或更精确 - **自动更新**:对象移动后自动更新位置信息 ## 🎮 **使用方法** ### **在应用中的集成** ```python # 1. 系统已自动初始化 # 屏幕投影拾取器在 MyWorld.__init__() 中自动创建 # 2. 模型自动注册 # 导入的模型会自动注册到拾取器 # 3. 手动注册对象(可选) self.screen_picker.registerObject(node_path, "对象名称", priority=1) # 4. 更新对象位置(对象移动后) self.screen_picker.updateObjectPositions() ``` ### **键盘快捷键** - **P键**:切换拾取方法(屏幕投影 ↔ 射线检测) - **T键**:创建测试立方体(用于测试拾取功能) - **R键**:切换射线调试显示 ## 📋 **测试步骤** 1. **启动应用**:运行 `python3 test.py` 2. **创建测试对象**:按 **T键** 创建测试立方体 3. **测试选择**: - 点击立方体附近区域 - 观察选择效果 4. **比较方法**:按 **P键** 切换拾取方法,比较效果差异 5. **导入模型**:拖拽3D模型文件到应用中测试 ## 🔍 **调试信息** 系统会在控制台输出详细的调试信息: ``` === 开始屏幕投影拾取 === 鼠标位置: (372, 265) 选中对象: TestCube_1 ``` ## 🛠 **技术细节** ### **坐标系转换** ```python # Qt坐标系 → 世界坐标系 → 屏幕坐标系 pixel_x = (screen_point.getX() + 1.0) * win_width * 0.5 pixel_y = (1.0 - screen_point.getY()) * win_height * 0.5 ``` ### **半径计算** - **自动模式**:基于对象包围盒的最大尺寸 - **自定义模式**:可为特定对象设置自定义选择半径 - **距离补偿**:远距离对象使用基于透视投影的估算 ### **选择算法** ```python # 计算选择分数 distance_score = 1.0 - (distance / effective_radius) priority_score = priority * 10.0 total_score = distance_score + priority_score ``` ## 🎯 **使用建议** 1. **优先使用屏幕投影拾取**:对于大多数交互场景更准确 2. **射线检测作为备选**:某些特殊情况下仍然有用 3. **调整容差**:根据需要调整 `tolerance_multiplier` 参数 4. **设置优先级**:为不同类型的对象设置合适的选择优先级 ## 🔄 **后向兼容** - 原有的射线检测系统仍然保留 - 现在屏幕投影拾取为主要方法,射线检测为备选 - 所有现有的选择、拖拽、GUI编辑功能都正常工作 ## 📝 **总结** 新的屏幕投影拾取系统解决了您遇到的射线偏向屏幕中心的问题,提供了更准确、更直观的对象选择体验。系统已完全集成到您的应用中,并保持了向后兼容性。