我的目标是创建一个直观的3D机械手,以处理用Qt / QML制作的3D编辑器中显示的网格的旋转。
为此,当用户单击实体时,会在网格周围生成3个托里,代表用户可以作用的欧拉角。如果用户然后单击一个圆环,我希望他能够通过拖动鼠标来旋转网格。用户似乎很自然地做到了这一点,就是将鼠标沿圆环沿他们希望网格旋转的方向拖动。
因此,我需要一种方法来了解用户如何旋转鼠标。我想到了一种方法:当用户单击圆环时,我会检索圆环中心的位置。然后,我将此世界位置转换为其屏幕位置。然后,我监视鼠标光标和圆环中心之间的角度。这个角度的变化应该告诉我我需要的一切:如果该角度顺时针增大,则网格应顺时针旋转,反之亦然。该解决方案将产生对我的应用程序足够好的结果,因为它不依赖于摄像机的角度,或者仅取决于很小的角度。
但是,我找不到用Qt将世界位置转换为其屏幕位置的方法。我找到了函数QVector3D::project(const QMatrix4x4 &modelView, const QMatrix4x4 &projection, const QRect &viewport)
,但是它的文档非常少,我找不到使用它的任何人……我可能已经找到了要为projection
参数({{1} }属性(来自QCamera,在这里https://doc.qt.io/qt-5/qml-qt3d-render-camera.html),仅此而已。什么是projectionMatrix
?还有modelView
吗?仅仅是viewport
吗?
如果任何人都有任何领先优势,那将是惊人的,我在任何地方都找不到任何东西,现在我有点失去希望了。也许还有另一个更简单的解决我的问题的方法?请注意,用户还可以在网格周围自由移动相机,这会增加复杂性。
非常感谢您的时间,祝您有愉快的一天!
答案 0 :(得分:0)
是的,您应该能够使用上述功能将世界位置转换为屏幕位置。您对projection
参数是正确的。至于modelView
参数,您应该使用QCamera的viewMatrix
属性,这是官方文档中缺少的属性,但是对我有用。 viewport
参数代表您要投影的屏幕部分的尺寸。如果使用全屏全高清投影,则可以使用QRect(0, 0, 1920, 1080)
,否则可以使用QRect(QPoint(0, 0), view->size())
之类的东西,其中view
是3D图像的上影或窗口。请注意,最终的屏幕位置将使y = 0
朝下,正值在上面,与通常的屏幕坐标相反。