Моя цель - создать интуитивно понятный трехмерный манипулятор для обработки вращений сеток, отображаемых в моем 3D-редакторе, с использованием Qt / QML.
Для этого, когда пользователь нажимает на объект, 3 тора появляется вокруг me sh, представляющего углы эйлера, под которыми пользователь может действовать. Если пользователь затем нажимает на один тор, я хочу, чтобы он мог вращать меня sh, перетаскивая мышь. Кажется, что естественный способ сделать это - перетаскивать мышь вокруг тора в том направлении, в котором они хотят, чтобы me sh вращался.
Поэтому мне нужен способ узнать, как пользователь вращает свою мышь. Я придумал способ: когда пользователь нажимает на тор, я получаю положение центра тора. Затем я перевожу эту мировую позицию на ее экранную позицию. Затем я отслеживаю угол между курсором мыши и центром тора. Эволюция этого угла должна рассказать мне все, что мне нужно: если угол увеличивается по часовой стрелке, me sh должен вращаться по часовой стрелке и наоборот. Это решение должно дать достаточно хороший результат для моего приложения, поскольку оно не будет зависеть от угла наклона камеры или только очень минимально.
Однако я не могу найти способ перевести мировую позицию в позицию на экране с помощью 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)
?
Если бы у кого-то был какой-то вид лидерства, это было бы удивительно, я нигде не могу найти ничего, и сейчас я теряю надежду. Или, может быть, другое, более простое решение моей проблемы? Обратите внимание, что пользователь также может свободно перемещать камеру вокруг меня sh, что добавляет сложности.
Большое спасибо за ваше время и хорошего дня!