Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: grig_p от Сентябрь 17, 2021, 11:21



Название: Нечеткие границы при прорисовке на графической сцене.
Отправлено: grig_p от Сентябрь 17, 2021, 11:21
Здравствуйте!
Столкнулся с такой проблемой.
Есть графическая сцена QGraphicsScene и на ней множество итемов QGraphicsItem, один из которых представляет собой движущиеся по экрану полупрозрачные полосы. Это необходимо для визуальных помех в игре. В итемах перекрыты методы boundingRect() и paint().
метод paint() полос выглядит так:

Код:
void LinesIrriant::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    painter->setPen(QPen(m_color, 1, Qt::SolidLine, Qt::FlatCap));
    painter->setBrush(QBrush(m_color, Qt::SolidPattern));

        auto x = boundingRect().x() - m_width * (m_dutyCycle + 1) + m_position % (m_width * (m_dutyCycle + 1));
        while (x < boundingRect().x() + boundingRect().width())
        {
            painter->drawRect(static_cast<int>(x), static_cast<int>(boundingRect().y()),
                              m_width, static_cast<int>(boundingRect().height()));

            x += m_width * (m_dutyCycle + 1);
        }

    m_position += m_speed;
}

При прорисовке границы полос получаются не ровные, а рваные, как бы дрожащие, особенно на больших скоростях.
Посмотреть можно сдесь: https://disk.yandex.ru/i/W2HS6uTm_Z0lWQ
Как этого можно избежать?
Заранее огромное спасибо за советы.


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: __Heaven__ от Сентябрь 17, 2021, 12:09
Не много работал с QGraphicsScene, но визуально кажется, будто рисование выполняется поочерёдно для полос сразу на экран, а не через буфер


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: Igors от Сентябрь 17, 2021, 12:16
Необязательно, но возможно это фундаментальный эффект (или техника) "motion blur".  Если скорость достаточно велика, то объект должен оставлять за собой размазанный, затухающий след, иначе будут те самые артефакты восприятия что Вы показываете.

Так что надо блюрить, в Вашем случае это несложно, вот схемка

   ****Frame1*****

   xxxxxx****Frame2*****

Полоса сдвинулась. область xxx должна быть заполнена градиентом
      


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: grig_p от Сентябрь 17, 2021, 14:53
Спасибо большое!
Попробовал с градиентом. Получилось лучше, но все равно остались дерганья. Скорее всего, это из за нестабильного фреймрейта. Думаю, стоит поковырять в этом направлении


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: Igors от Сентябрь 17, 2021, 16:01
Попробовал с градиентом. Получилось лучше, но все равно остались дерганья. Скорее всего, это из за нестабильного фреймрейта. Думаю, стоит поковырять в этом направлении
Ну особо повлиять на фреймрейт нечем - или "тянет" или нет. Покажите что получилось

..вот схемка
Она не совсем верна :) Общее правило: для каждого пыкселя нужно иметь/вычислить его позицию на предыдущем кадре. Это так называемый "вектор блюра", и рисовать его с альфой от 1 до 0 поверх основного изображения. Если все аккуратно сделано - движение должно выглядеть плавным в анимации. Альтернатива "брутой форсой" - рендерить N раз (с достаточно малым шагом по времени) и осреднять с весами (ну то железячники так делают, там "карта" вместо моска)


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: grig_p от Сентябрь 17, 2021, 16:23
Спасибо.
Вот. https://disk.yandex.ru/i/DSCB3oxDBaCOhA
Красный маркер перемещается, управляемый внешним прибором, передающим данные с частотой 50 Гц. Присутствуют небольшие "рывки", а хочется, чтобы плавно двигалось


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: Igors от Сентябрь 17, 2021, 17:11
Вот. https://disk.yandex.ru/i/DSCB3oxDBaCOhA
А справа зачем? Там блюра нет, он только по ходу движения. И размер вычислять надо аккуратно, и альфу. Эффект должен быть намного мощнее. Пробовали смотреть какое-нибудь художественное видео по кадрам? Там иной раз так "намазюкано" что и кадр не узнать.

Красный маркер перемещается, управляемый внешним прибором, передающим данные с частотой 50 Гц. Присутствуют небольшие "рывки", а хочется, чтобы плавно двигалось
То же самое, motion blur применяется ко всему что движется


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: grig_p от Сентябрь 17, 2021, 17:59
Спасибо.
Попробовал справа без градиента, стало хуже.
А на маркере этих эффектов не видно, он не прямой и движется быстро.


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: Igors от Сентябрь 18, 2021, 12:16
Попробовал справа без градиента, стало хуже.
А на маркере этих эффектов не видно, он не прямой и движется быстро.
Вот пример как это должно выглядеть (аттач). Делайте аккуратно - и все получится.

Да, и пусть Вас не смущает что кадры могут выглядеть странно и даже уродливо, это плата за плавную анимацию.


Название: Re: Нечеткие границы при прорисовке на графической сцене.
Отправлено: grig_p от Сентябрь 20, 2021, 09:59
Спасибо большое за советы