Russian Qt Forum
Март 29, 2024, 14:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевернуть приложение на 90 зрадусов  (Прочитано 5180 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« : Январь 11, 2020, 16:38 »

Всем привет.
Для embeded у котором монитор повернут на 90 градосов надо перевернуть приложение.
Внутренний класс Qt QQuickWIndow имеется метод renderSceneGraph и вот там есть такой кусочек кода

Код:
if (renderTargetId) {
            QRect rect(QPoint(0, 0), renderTargetSize);
            fboId = renderTargetId;
            renderer->setDeviceRect(rect);
            renderer->setViewportRect(rect);
            if (QQuickRenderControl::renderWindowFor(q)) {
                renderer->setProjectionMatrixToRect(QRect(QPoint(0, 0), size), false);
                renderer->setDevicePixelRatio(devicePixelRatio);
            } else {
                renderer->setProjectionMatrixToRect(QRect(QPoint(0, 0), rect.size()), false);
                renderer->setDevicePixelRatio(1);
            }
        } else {
            QSize pixelSize;
            QSizeF logicalSize;
            if (surfaceSize.isEmpty()) {
                pixelSize = size * devicePixelRatio;
                logicalSize = size;
            } else {
                pixelSize = surfaceSize;
                logicalSize = QSizeF(surfaceSize) / devicePixelRatio;
            }
            QRect rect(QPoint(0, 0), pixelSize);
            renderer->setDeviceRect(rect);
            renderer->setViewportRect(rect);
            const bool flipY = rhi ? !rhi->isYUpInNDC() : false;
            renderer->setProjectionMatrixToRect(QRectF(QPoint(0, 0), logicalSize), flipY);
            renderer->setDevicePixelRatio(devicePixelRatio);
        }

И вот вместо одной строки

Код:
renderer->setProjectionMatrixToRect(QRectF(QPoint(0, 0), logicalSize), flipY);

нужно написать код для того чтобы приложение было повернуто.
Может кто подсказать как это правильно написать?
Заранее благодарю.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« Ответ #1 : Январь 12, 2020, 19:56 »

Как оказалось это называется rotation)
вот теперь понять бы как такое написать
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #2 : Январь 12, 2020, 22:47 »

немножко пальцем в небо:
Код
C++ (Qt)
renderer->setProjectionMatrixToRect(QRectF(QPoint(0, 0), logicalSize), flipY);
auto matrix = renderer->projectionMatrix();
matrix.rotate(90.0f, 1.0f, 0.0f); // не уверен какой вектор тут использовать
renderer->setProjectionMatrix(matrix);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #3 : Январь 14, 2020, 09:09 »

Цитировать
90 зрадусов
Про зраду и перемогу уже пошутили? (Извиняюсь, не удержался.)

kambala: интересно. Был немножко удивлён, что у QMatrix4x4::rotate() угол задаётся в градусах, а не радианах.
« Последнее редактирование: Январь 14, 2020, 09:14 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« Ответ #4 : Январь 14, 2020, 12:02 »

Цитировать
90 зрадусов
Про зраду и перемогу уже пошутили? (Извиняюсь, не удержался.)

kambala: интересно. Был немножко удивлён, что у QMatrix4x4::rotate() угол задаётся в градусах, а не радианах.

Очепятолся, или это проблема? Или зацепиться за одну неправильную букву это ваше кредо? Лучше бы раз знаете как это сделать посоветовали, а не писать вот это все.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« Ответ #5 : Январь 14, 2020, 17:15 »

немножко пальцем в небо:
Код
C++ (Qt)
renderer->setProjectionMatrixToRect(QRectF(QPoint(0, 0), logicalSize), flipY);
auto matrix = renderer->projectionMatrix();
matrix.rotate(90.0f, 1.0f, 0.0f); // не уверен какой вектор тут использовать
renderer->setProjectionMatrix(matrix);

Ваш совет не помог, куда то окно пропало вообще)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #6 : Январь 14, 2020, 17:35 »

значит, поворот был вокруг не того вектора. Наверное, надо использовать центр прямоугольника.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 14, 2020, 17:49 »

Ваш совет не помог, куда то окно пропало вообще)
Ну идея-то могла быть верной. Я бы попробовал
Код
C++ (Qt)
matrix.rotate(10.0f, 0.0f, 0.0f, 1.0f);
И посмотрел куда крутит (поворот вокруг Z выглядит наиболее логичным). И конечно распечатать матрицу (до и после) , может в ней параметры перспективы, тогда крутить нельзя
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« Ответ #8 : Январь 14, 2020, 19:34 »

Ваш совет не помог, куда то окно пропало вообще)
Ну идея-то могла быть верной. Я бы попробовал
Код
C++ (Qt)
matrix.rotate(10.0f, 0.0f, 0.0f, 1.0f);
И посмотрел куда крутит (поворот вокруг Z выглядит наиболее логичным). И конечно распечатать матрицу (до и после) , может в ней параметры перспективы, тогда крутить нельзя

Я вот сейчас глянул и поулчается что поворот идет во круг X Y, а как крутить правильно во круг Z?) просто тут же в функции только два первых передаются. Или я чет путаю в этом.
И сразу вопрос, а если из функции просто вытащить это добро

Код:
QMatrix4x4 matrix;
    matrix.ortho(rect.x(),
                 rect.x() + rect.width(),
                 flipY ? rect.y() : rect.y() + rect.height(),
                 flipY ? rect.y() + rect.height() : rect.y(),
                 1,
                 -1);
    setProjectionMatrix(matrix);

и не нужно ли случайно тогда менять местами высоты X и Y?
Спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #9 : Январь 14, 2020, 19:40 »

поворот вокруг Z выглядит наиболее логичным
и правда Улыбающийся я о точке почему-то думал, а ведь надо было о векторе, смотрящем «на нас». 0,0,1 должен подойти.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Январь 15, 2020, 10:21 »

Я вот сейчас глянул и поулчается что поворот идет во круг X Y, а как крутить правильно во круг Z?)
Задать ось поворота (0, 0, 1)

просто тут же в функции только два первых передаются. Или я чет путаю в этом.
Параметров 4 (угол + xyz), последний (z) по default 0

И сразу вопрос, а если из функции просто вытащить это добро
...
и не нужно ли случайно тогда менять местами высоты X и Y?
Сначала поверните на небольшой угол и покажите скрыншот что получилось, а там уже и станет ясно менять высоты или как

я о точке почему-то думал, а ведь надо было о векторе, смотрящем «на нас». 0,0,1 должен подойти.
Точку тоже никто не отменял  Улыбающийся
« Последнее редактирование: Январь 15, 2020, 10:24 от Igors » Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 210


Просмотр профиля
« Ответ #11 : Январь 15, 2020, 12:38 »

Я вот сейчас глянул и поулчается что поворот идет во круг X Y, а как крутить правильно во круг Z?)
Задать ось поворота (0, 0, 1)

просто тут же в функции только два первых передаются. Или я чет путаю в этом.
Параметров 4 (угол + xyz), последний (z) по default 0

И сразу вопрос, а если из функции просто вытащить это добро
...
и не нужно ли случайно тогда менять местами высоты X и Y?
Сначала поверните на небольшой угол и покажите скрыншот что получилось, а там уже и станет ясно менять высоты или как

я о точке почему-то думал, а ведь надо было о векторе, смотрящем «на нас». 0,0,1 должен подойти.
Точку тоже никто не отменял  Улыбающийся

В общем, первое что получилось обнаружить так это то что надо закоментить в файле qsgbatchrender.cpp в методе renderUnmergedBatch() вот такое добро

Код:
        if (m_useDepthBuffer) {
            m_current_projection_matrix(2, 2) = m_zRange;
            m_current_projection_matrix(2, 3) = 1.0f - e->order * m_zRange;
        }

Дальеш я вытащил из метода setProjectionMatrixToRect() то что касалось высоты и ширины в методе ortho

Код:
            QMatrix4x4 matrix;
            matrix.ortho(rect.x(),
                         rect.x() + rect.width(),
                         rect.y() + rect.height(),
                         rect.y(),
                         1,
                         -1);
            matrix.rotate(90.0f, 0.0f, 0.0f, 1.0f);
            renderer->setProjectionMatrix(matrix);

единственное мне кажется что что то с высотой и шириной надо мудрить. Пока не разобрался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 22.