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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нечеткие границы при прорисовке на графической сцене.  (Прочитано 4332 раз)
grig_p
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« : Сентябрь 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
Как этого можно избежать?
Заранее огромное спасибо за советы.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Сентябрь 17, 2021, 12:09 »

Не много работал с QGraphicsScene, но визуально кажется, будто рисование выполняется поочерёдно для полос сразу на экран, а не через буфер
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 17, 2021, 12:16 »

Необязательно, но возможно это фундаментальный эффект (или техника) "motion blur".  Если скорость достаточно велика, то объект должен оставлять за собой размазанный, затухающий след, иначе будут те самые артефакты восприятия что Вы показываете.

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

   ****Frame1*****

   xxxxxx****Frame2*****

Полоса сдвинулась. область xxx должна быть заполнена градиентом
      
« Последнее редактирование: Сентябрь 17, 2021, 12:20 от Igors » Записан
grig_p
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #3 : Сентябрь 17, 2021, 14:53 »

Спасибо большое!
Попробовал с градиентом. Получилось лучше, но все равно остались дерганья. Скорее всего, это из за нестабильного фреймрейта. Думаю, стоит поковырять в этом направлении
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 17, 2021, 16:01 »

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

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

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #5 : Сентябрь 17, 2021, 16:23 »

Спасибо.
Вот. https://disk.yandex.ru/i/DSCB3oxDBaCOhA
Красный маркер перемещается, управляемый внешним прибором, передающим данные с частотой 50 Гц. Присутствуют небольшие "рывки", а хочется, чтобы плавно двигалось
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 17, 2021, 17:11 »

А справа зачем? Там блюра нет, он только по ходу движения. И размер вычислять надо аккуратно, и альфу. Эффект должен быть намного мощнее. Пробовали смотреть какое-нибудь художественное видео по кадрам? Там иной раз так "намазюкано" что и кадр не узнать.

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

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #7 : Сентябрь 17, 2021, 17:59 »

Спасибо.
Попробовал справа без градиента, стало хуже.
А на маркере этих эффектов не видно, он не прямой и движется быстро.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 18, 2021, 12:16 »

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

Да, и пусть Вас не смущает что кадры могут выглядеть странно и даже уродливо, это плата за плавную анимацию.
« Последнее редактирование: Сентябрь 18, 2021, 12:20 от Igors » Записан
grig_p
Новичок

Offline Offline

Сообщений: 11


Просмотр профиля
« Ответ #9 : Сентябрь 20, 2021, 09:59 »

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


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