Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: SektorCT от Январь 11, 2020, 16:38



Название: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 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);

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


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 12, 2020, 19:56
Как оказалось это называется rotation)
вот теперь понять бы как такое написать


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: kambala от Январь 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);


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: DarkHobbit от Январь 14, 2020, 09:09
Цитировать
90 зрадусов
Про зраду и перемогу уже пошутили? (Извиняюсь, не удержался.)

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


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 14, 2020, 12:02
Цитировать
90 зрадусов
Про зраду и перемогу уже пошутили? (Извиняюсь, не удержался.)

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

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


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 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);

Ваш совет не помог, куда то окно пропало вообще)


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: kambala от Январь 14, 2020, 17:35
значит, поворот был вокруг не того вектора. Наверное, надо использовать центр прямоугольника.


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


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 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?
Спасибо.


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: kambala от Январь 14, 2020, 19:40
поворот вокруг Z выглядит наиболее логичным
и правда :) я о точке почему-то думал, а ведь надо было о векторе, смотрящем «на нас». 0,0,1 должен подойти.


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: Igors от Январь 15, 2020, 10:21
Я вот сейчас глянул и поулчается что поворот идет во круг X Y, а как крутить правильно во круг Z?)
Задать ось поворота (0, 0, 1)

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

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

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


Название: Re: Перевернуть приложение на 90 зрадусов
Отправлено: SektorCT от Январь 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);

единственное мне кажется что что то с высотой и шириной надо мудрить. Пока не разобрался.