获取网格中心的屏幕位置

问题描述 投票:3回答:1

[我的目标是创建一个直观的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编辑器中显示的网格的旋转。为此,当用户单击一个实体时,在...

c++ qt 3d rotation qml
1个回答
0
投票
是的,您应该能够使用上述功能将世界位置转换为屏幕位置。您对projection参数是正确的。至于modelView参数,您应该使用QCamera的viewMatrix属性,这是官方文档中所缺少的,但是对我有用。 viewport参数代表您要投影的屏幕部分的尺寸。如果使用全屏全高清投影,则可以使用QRect(0, 0, 1920, 1080),否则可以使用QRect(QPoint(0, 0), view->size())之类的东西,其中view是带有3D图像的竖影或窗口。请注意,结果屏幕位置将使y = 0向下,而正值在上面,这与通常的屏幕坐标相反。
© www.soinside.com 2019 - 2024. All rights reserved.