Повернуть виджет вокруг своей оси Y В QT в трехмерном пространстве

Я хотел бы повернуть виджет вокруг своей оси Y (или любой оси) в QT точно так же, как показано здесь:

Поворот изображения в трехмерном пространстве вокруг оси Y

Я искал, но все, что я получил 2d преобразование, как вращение по часовой стрелке или против часовой стрелки

Я действительно хочу что-то очень простое, потому что я сделаю это один раз во всем проекте.

0

Решение

Во-первых, обычный виджет Qt не может сделать это из-за того, как работает механизм рисования (он полностью двумерный), и как работают менеджеры компоновки, поэтому любое решение нетривиально.

Самый простой способ сделать это, чтобы поместить виджет в QGraphicsScene/View как QGraphicsProxyWidgetи использовать setTransform(const QTransform&, bool) метод применения матрицы преобразования.

Однако, поскольку движок все еще 2D, вам придется создать матрицу трехмерного преобразования, описывающую нужную вам операцию, а затем использовать проекцию для преобразования в двумерную матрицу. Это не просто, но вы можете «подделать» эффект, подобный тому, к которому вы привязались, используя статический метод squareToQuad(const QPolygonF&, QTransform&) — по мере того, как пользователь «поворачивает» виджет, один вертикальный край становится меньше и перемещается к центру квадрата, тогда как противоположный край становится больше и движется к центру квадрата.

1

Другие решения

Проще всего сделать и понять, нарисовать виджет в QPixmap. Затем подкласс QWidget рисует этот QPixmap, преобразованный для соответствия трехмерному вращению или «поддельному» вращению. Поскольку эта картина аккуратно находится внутри одиночного paintEvent () в вашем пользовательском виджете, легко начать с поддельной версии (например, без перспективы), а затем вернуться к ней и улучшить ее, если есть время и необходимость.

Например, было бы довольно легко сделать рисование с использованием OpenGL, например, на основе «Текстура» пример в openGL примеры Qt.

0

Если вы действительно хотите выполнить это в проекте Qt таким образом, который бы хорошо интегрировался с другими виджетами пользовательского интерфейса, я бы порекомендовал проверить Qt Quick (Qt 4.7+) или Qt Quick 2.0 (Qt 5.0 +). Они специально предназначены для облегчения создания более динамичных интерфейсов. Они используют QML (css-подобный язык разметки, который описывает функциональность виджетов) в сочетании со знакомой оболочкой C ++ более высокого уровня, к которой можно получить доступ, как и к любому другому виджету Qt. Qt Quick 2.0 особенно хорош, будучи в состоянии относительно легко рисовать эффекты системы частиц.

0
По вопросам рекламы [email protected]