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