c++ - 获取网格中心的屏幕位置
问题描述
我的目标是创建一个直观的 3D 操纵器来处理在我的 3D 编辑器中显示的网格旋转,该编辑器使用 Qt / QML 制作。
为此,当用户单击实体时,会在网格周围生成 3 个环面,代表用户可以操作的欧拉角。如果用户然后单击一个圆环,我希望他能够通过拖动鼠标来旋转网格。用户似乎这样做的自然方式是在他们希望网格旋转的方向上围绕圆环拖动鼠标。
因此,我需要一种方法来了解用户如何旋转鼠标。我想了一个办法:当用户点击环面时,我检索环面中心的位置。然后,我将这个世界位置转换为它的屏幕位置。然后,我监视鼠标光标与圆环中心之间的角度。这个角度的演变应该告诉我我需要的一切:如果角度顺时针增加,网格应该顺时针旋转,反之亦然。这个解决方案应该为我的应用程序产生足够好的结果,因为它不依赖于相机的角度,或者只是非常少。
但是,我找不到使用 Qt 将世界位置转换为其屏幕位置的方法。我找到了这个函数QVector3D::project(const QMatrix4x4 &modelView, const QMatrix4x4 &projection, const QRect &viewport)
,但它的文档非常稀缺,我找不到任何人使用它......我可能已经找到了projection
参数的输入内容(projectionMatrix
来自 QCamera 的属性,这里https://doc.qt.io /qt-5/qml-qt3d-render-camera.html),仅此而已。是什么modelView
?和viewport
?是不是很简单QRect(0, 0, 1920, 1080)
?
如果有人有任何线索,那就太棒了,我在任何地方都找不到任何东西,我现在有点失去希望了。或者也许是我的问题的另一个更简单的解决方案?请注意,用户还可以在网格周围自由移动相机,这增加了复杂性。
非常感谢您的宝贵时间,祝您有美好的一天!
解决方案
是的,您应该能够使用上述功能从世界位置转换到屏幕位置。你对这个projection
论点是正确的。至于modelView
论点,您应该使用viewMatrix
官方文档中缺少的 QCamera 的属性,但它对我有用。该viewport
参数表示您正在投影的屏幕部分的尺寸。如果您QRect(0, 0, 1920, 1080)
使用全屏全高清投影,则可以使用,否则使用类似3D 图像的 wigdet 或窗口在QRect(QPoint(0, 0), view->size())
哪里。view
请注意,生成的屏幕位置将y = 0
向下且正值在上方,这与通常的屏幕坐标相反。
推荐阅读
- python - 在python中读取一个txt文件,观察之间有多个空格
- python - 分布的积分返回 nan 值
- javascript - axios如何获取tree json并渲染一个vue页面?
- javascript - 如何简化 JavaScript/React
- maven - 在参数中使用带有连字符的 maven exec 插件
- android - 相机预览在预览中拉伸/挤压
- java - GetStringExtra 总是返回 null
- angular - RXJS 6.0:./node_modules/rxjs-compat/_esm5/add/operator/publishReplay.js 中的错误
- mql4 - 尝试读取文件时 MQL4 错误 5004 和 5002
- android - Android studio升级到3.2后出现startup failed:initialization script '/tmp/ijinit.gradle'错误