Получить положение экрана центра сетки - PullRequest
2 голосов
/ 10 января 2020

Моя цель - создать интуитивно понятный трехмерный манипулятор для обработки вращений сеток, отображаемых в моем 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, что добавляет сложности.

Большое спасибо за ваше время и хорошего дня!

1 Ответ

0 голосов
/ 02 мая 2020

Да, вы должны быть в состоянии перевести из мирового положения в положение экрана, используя упомянутую функцию. Вы правы в отношении аргумента projection. Что касается аргумента modelView, вы должны использовать свойство viewMatrix из QCamera, которое отсутствует в официальной документации, но оно работает для меня. Параметр viewport представляет размеры той части экрана, на которую вы проецируете. Вы можете использовать QRect(0, 0, 1920, 1080), если вы используете полноэкранную проекцию Full HD, в противном случае используйте что-то вроде QRect(QPoint(0, 0), view->size()), где view - это окно или окно с вашим 3D-изображением. Будьте осторожны, чтобы полученная позиция экрана имела y = 0 внизу и положительные значения выше, что противоположно обычным экранным координатам.

...