Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ эффект мерцающих звёзд

Автор: efg 4.6.2011, 20:36

есть статичное изображение. нужно изменить заданную область - в моём случае небо - так, чтобы казалось, что это анимация (смазать, размыть, может быть, так, что коэффициенты рассчитываются случайно) и нарисовать (несколько раз в секунду, конечно). в какую сторону копать? нужно учить opengl? или можно обойтись средствами qpainter? есть ли готовые примеры, или хотя бы что-то похожее?

Автор: Litkevich Yuriy 4.6.2011, 20:54

Цитата(efg @ 4.6.2011, 23:36) *
нужно изменить заданную область - в моём случае небо
что она из себя представляет, как ты её делаешь?

Автор: efg 4.6.2011, 21:16

Цитата(Litkevich Yuriy @ 4.6.2011, 21:54) *
Цитата(efg @ 4.6.2011, 23:36) *
нужно изменить заданную область - в моём случае небо
что она из себя представляет, как ты её делаешь?

массив точек, изображающих геометрическую фигуру из изломанных линий...


и к этой области нужно применить эффекты

Автор: Алексей1153 5.6.2011, 12:25

efg, какие будут использованы примитивы (точки, линии, многоугольники) - неважно , главное, это вывод анимации. У каждого примитива должна быть либо функция яркости/цвета от времени. Возможно , даже лучше оставить такую фишку, как задание функциии объекта B в виде функяии объекта A + сдвиг по фазе. Время тактируй при помощи таймера (для человечьего глаза достаточно 50...250 мс). И всё, вперёд - на мины )

Автор: efg 5.6.2011, 14:01

Цитата(Алексей1153 @ 5.6.2011, 13:25) *
efg, какие будут использованы примитивы (точки, линии, многоугольники) - неважно , главное, это вывод анимации

естественно
Цитата(Алексей1153 @ 5.6.2011, 13:25) *
У каждого примитива должна быть либо функция яркости/цвета от времени

либо что? и к чему это вообще?
Цитата(Алексей1153 @ 5.6.2011, 13:25) *
Возможно , даже лучше оставить такую фишку, как задание функциии объекта B в виде функяии объекта A + сдвиг по фазе

я ничего не понял же!
Цитата(Алексей1153 @ 5.6.2011, 13:25) *
Время тактируй при помощи таймера (для человечьего глаза достаточно 50...250 мс). И всё, вперёд - на мины )

уж не стал бы я делать цикл while... sleep

ответьте по существу - вопросы в первом посте

Автор: Litkevich Yuriy 5.6.2011, 17:23

на языке крутится blur (по-моему пример такой был, толи штатный в 4.7, толи в блоге у тролей)

Автор: Алексей1153 5.6.2011, 17:23

>>ответьте по существу - вопросы в первом посте

я ответил на САБЖ
>>эффект мерцающих звёзд

и никто не виноват, что ты не умеешь вопрос задавать. А какой вопрос - такой и ответ :)

Но всё равно всё выйдет так, как я описал - будет функция от времени некоего параметра.

>>уж не стал бы я делать цикл while... sleep
цикл тут ни при чём, я про таймер говорил

Автор: Litkevich Yuriy 5.6.2011, 17:28

Цитата(Алексей1153 @ 5.6.2011, 20:23) *
будет функция от времени некоего параметра
и что она будет делать?

Автор: Алексей1153 5.6.2011, 17:33

странный вопрос. Будет выдавать новое значение изменяемого параметра

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

Автор: ufna 5.6.2011, 17:40

а можно как-то конкретизировать задачу или привести пример?

Автор: Алексей1153 5.6.2011, 17:46

>>или привести пример
и желательно на видео ))

Автор: efg 6.6.2011, 1:23

Цитата(Алексей1153 @ 5.6.2011, 18:23) *
>>ответьте по существу - вопросы в первом посте

я ответил на САБЖ
>>эффект мерцающих звёзд

и никто не виноват, что ты не умеешь вопрос задавать. А какой вопрос - такой и ответ :)

Цитата(efg @ 4.6.2011, 21:36) *
в какую сторону копать? нужно учить opengl? или можно обойтись средствами qpainter? есть ли готовые примеры, или хотя бы что-то похожее?

http://www.forum.crossplatform.ru/index.php?s=&showtopic=7073&view=findpost&p=50336 не было ни слова ни про opengl, ни про иные средства, с помощью можно достичь желаемого эффекта. поправьте меня, если это не так.

Цитата(Алексей1153 @ 5.6.2011, 18:23) *
>>уж не стал бы я делать цикл while... sleep
цикл тут ни при чём, я про таймер говорил

а я имел в виду, что использование таймера очевидно

Цитата(ufna @ 5.6.2011, 18:40) *
а можно как-то конкретизировать задачу или привести пример?

пусть дано изображение

и задана область

применяем к области искажение\размытие (не обязательно блюр - скорее, даже, блюр как раз и не подойдёт - лучше что-нибудь вроде "волн") и получаем


для любителей интерактива примитивная гифка:

Автор: ufna 6.6.2011, 2:05

задача делится на три части:

1. выделение области
2. подготовка нескольких изображений
3. смена их по событию таймера

1 думаю решена

2 и 3 взаимосвязаны. применять эффекты к области - дело муторное. проще - берешь баундинг бокс этой области, и применяешь эффект к нему. область работает как маска. после чего, по событию таймера, рисуешь по маске нужное изображение.

все средствами QPainter реализуется.

эффект блюра - алгоритм простой, на QPainter без проблем делается.

Автор: Litkevich Yuriy 6.6.2011, 7:30

Цитата(Алексей1153 @ 5.6.2011, 20:33) *
Но из первого поста это неочевидно
Цитата(efg @ 4.6.2011, 23:36) *
это анимация (смазать, размыть,
по-моему всё очевидно

Автор: efg 6.6.2011, 10:25

нашёл, вот:
http://doc.qt.nokia.com/qq/32/qq32-next-gen-uis.html
http://doc.qt.nokia.com/4.7/qgraphicsblureffect.html

Quiet.h:

#ifndef QUIET_H
#define QUIET_H

#include <QtGui>

class quiet : public QWidget {
    Q_OBJECT

public:
    quiet(QWidget *parent = 0);
    ~quiet();
    void paintEvent(QPaintEvent *event);
private:
    QImage image;
    QPixmap pixmap;
    QGraphicsBlurEffect effect;
    QGraphicsPixmapItem pixmapItem;
    QTimer *timer;
private slots:
    void reDraw();
};

#endif // QUIET_H


Quiet.cpp:
#include "quiet.h"

quiet::quiet(QWidget *parent) : QWidget(parent) {
    setWindowTitle("Quiet");
    resize(640, 480);
    setMaximumSize(640, 480);
    setMinimumSize(640, 480);
    image.load(":/images/pic.png", "png");
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(reDraw()));
    timer->start(100);
    repaint();
}

quiet::~quiet() {
}

void quiet::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    QPoint point;
    point.setX(0);
    point.setY(0);
    //painter.drawImage(point, image);
    painter.drawPixmap(point, pixmap);
}

void quiet::reDraw() {
    pixmap.fromImage(image, Qt::AutoColor);
    pixmapItem.setPixmap(pixmap);
    effect.setBlurRadius(0.1); // случайные значения сюда
    pixmapItem.setGraphicsEffect(&effect);
    repaint();
}


не только ничего не рисуется, так ещё и при закрытии окна вылезает appcrash
что я делаю не так?

Автор: efg 6.6.2011, 12:29

работает, только если применить эффект ко всему виджету... boundingRectFor(rect) не учитывается почему-то

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)