Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Igors от Декабрь 22, 2014, 09:49



Название: Шарик
Отправлено: Igors от Декабрь 22, 2014, 09:49
Добрый день

Нужен просто шарик - но бросаться в пучину OpenGL совсем не хочется. А там еще мутные шейдера пойдут - вообще ховайся  :'(  Я конечно понимаю что будет более сложный объект - и OpenGL неизбежен. Но сейчас мне нужен всего лишь шарик, ничего более. Отделаться сохраненными картинками не удается. Как же мне нарисовать шарик простыми средствами QPainter?

Спасибо


Название: Re: Шарик
Отправлено: __Heaven__ от Декабрь 22, 2014, 10:05
У меня есть один на шейдерах. Код немного кривой - генерировал сам на треугольниках. Если заинтересует, то могу дать. Кстати, мой шарик не принимает нормали, а высчитывает их прямо в шейдере.


Название: Re: Шарик
Отправлено: __Heaven__ от Декабрь 22, 2014, 10:10
вот


Название: Re: Шарик
Отправлено: Johnik от Декабрь 22, 2014, 10:16
Делал так:
Код:
QPixmap createSphere(uchar diameter, const QColor& color) const
{
QPixmap pixmap(diameter, diameter);
pixmap.fill(Qt::transparent);

QPainter p;
p.begin(&pixmap);
p.setRenderHint(QPainter::Antialiasing, true);
p.setPen(QPen(Qt::NoPen));
qreal gx = diameter * 0.3125;
QRadialGradient gradient(gx, gx, diameter);
gradient.setColorAt(0, QColor(255, 255, 255));
gradient.setColorAt(0.5, color);
gradient.setColorAt(1, color);
p.setBrush(QBrush(gradient));
p.drawEllipse(1, 1, diameter - 2, diameter - 2);
p.end();

return pixmap;
}


Название: Re: Шарик
Отправлено: Igors от Декабрь 22, 2014, 10:44
У меня есть один на шейдерах. Код немного кривой - генерировал сам на треугольниках. Если заинтересует, то могу дать. Кстати, мой шарик не принимает нормали, а высчитывает их прямо в шейдере.
Понятно что с OpenGL это просто. Но, повторюсь, тащить эту бандуру, а тем более шейдеры, не вызывает энтузиазма. И потом - Вам не кажется это неестественным? Исходных данных у шарика аж 2: центр и радиус. А мы зачем-то создаем не одну сотню треугольников. Разве это правильно?

Делал так:
С исходным белым цветом все залито, а с др впечатление что шарик сам светится (аттач). Но понимаю что критиковать легче чем делать, спасибо за код.

 


Название: Re: Шарик
Отправлено: Johnik от Декабрь 22, 2014, 10:55
С исходным белым цветом все залито, а с др впечатление что шарик сам светится (аттач). Но понимаю что критиковать легче чем делать, спасибо за код.
мне проще было, у меня шарик 16х16.
Можно попробовать изменить параметры градиента.


Название: Re: Шарик
Отправлено: __Heaven__ от Декабрь 22, 2014, 10:55
А мы зачем-то создаем не одну сотню треугольников. Разве это правильно?
Тесселяция в помощь!  :) Шучу.

Визуально на вашем скриншоте затемнения просто не хватает в правом нижнем углу. Можно подстроить градиент, чтобы переходил в бордовый.


Название: Re: Шарик
Отправлено: Igors от Декабрь 22, 2014, 15:04
Можно подстроить градиент, чтобы переходил в бордовый.
Люди ждут на светофоре перехода, горит красный, но машин нет. Но вот стоило одному пойти - и все потянулись за ним. Никогда не замечали? :) 

Градиент - нормальное решение, дешевое, практичное. Но это fake, т.е. "есть какое-то сходство" - но не более того. Думаю что если начать развивать/углублять этот fake - ничего доброго не выйдет, получится "система рычагов", др словами большой уродливый велосипед. А нет ли другого (принципиально другого) решения? 


Название: Re: Шарик
Отправлено: Bepec от Декабрь 22, 2014, 15:18
Всё что вы рисуете Opengl/painter'ом и прочими инструментами суть есть обман зрения, не более. И всё равно оно приводится к двумерной картинке.
Потому и ваш шарик и шарик на Qt одинаково правдивы, Правда в кутешном градиент подобрать чуть лучше надо.


Название: Re: Шарик
Отправлено: __Heaven__ от Декабрь 22, 2014, 15:20
Люди ждут на светофоре перехода, горит красный, но машин нет. Но вот стоило одному пойти - и все потянулись за ним. Никогда не замечали? :) 
Не, обычно я иду на красный первым и не оборачиваюсь :)
Я имел в виду, что нужно подкрасить ваш существующий градиент.
Кажется, что вы слишком много хотите получить, точнее накостылить... И чего вы так с OpenGL не в ладах....

ваш шарик и шарик на Qt одинаково правдивы, Правда в кутешном градиент подобрать чуть лучше надо.
Присоединяюсь. Ваш шарик тоже имеет острые края - значит fake


Название: Re: Шарик
Отправлено: Igors от Декабрь 22, 2014, 16:57
Всё что вы рисуете Opengl/painter'ом и прочими инструментами суть есть обман зрения, не более. И всё равно оно приводится к двумерной картинке.
А разве в реальной Вы каким-то образом можете видеть "не-двумерную"? :) Вряд ли т.к. человеческий глаз - та же камера, никаких принципиальных отличий нет.

И чего вы так с OpenGL не в ладах....
Возможно Вы хотели спросить почему я его не люблю. Потому что там убогость выдается за вершину инженерной мысли. В принципе это нормально, компаниям надо продать свои железки - но нельзя же верить всему на  слово

Не, обычно я иду на красный первым и не оборачиваюсь :)
Я имел в виду, что нужно подкрасить ваш существующий градиент.
В данном случае Вы послушно идете за предложенным Johnik решением, без всяких попыток предложить свое. А между тем альтернатива довольно очевидна  :)


Название: Re: Шарик
Отправлено: __Heaven__ от Декабрь 22, 2014, 17:10
Да, не обратил внимания на предложенный Johnik вариант (видимо, концентрировался на своих мыслях  :) )
Не забывайте, что у человека две "камеры" составляют картинку и полностью обмануть этот механизм плоскостью с картинкой вряд ли удастся.
Ну, убогость - это громко. Чтож этой убогостью пользуются миллионы? Какие альтернативы можете назвать? В крайнем случае можно достигнуть своей вершины инженерной мысли  ;)


Название: Re: Шарик
Отправлено: Bepec от Декабрь 22, 2014, 18:10
У человека имеются 2 камеры, которые позволяют снять карту глубин (не помню точно как называется, но суть у человека имеется 2 картинки по которым он может составить трёхмерную модель :D ).

А изображение на экране даёт лишь 2 картинки без глубины :)  Opengl просто позволяет рассчитать и нарисовать картинку с нужными градиентами.


Название: Re: Шарик
Отправлено: Igors от Декабрь 22, 2014, 18:31
У человека имеются 2 камеры, которые позволяют снять карту глубин (не помню точно как называется, но суть у человека имеется 2 картинки по которым он может составить трёхмерную модель :D ).
Называется стереоскопия (хотя говорят и по-простому "стерео"). Не вдаваясь в детали - этот эффект имеет какое-то значение на достаточно  близком расстоянии. Закройте один глаз и посмотрите другим на девушку с расстояния хотя бы 10 метров. Потом посмотрите другим - визуально ножки и все остальное то же самое  :)

Ну, убогость - это громко. Чтож этой убогостью пользуются миллионы? Какие альтернативы можете назвать? В крайнем случае можно достигнуть своей вершины инженерной мысли  ;)
То есть альтернативы великому и могучему OpenGL нет - и быть не может! Даже в случае простейшего шарика - мы должны либо довольствоваться подделкой градиентами - либо запрягать по полной программе. Правильно?

Цитировать
Стало быть так-таки и нету?
:)


Название: Re: Шарик
Отправлено: Bepec от Декабрь 22, 2014, 19:12
Любая поделка будет работать с градиентами :D Ибо все технологии подстраиваются под глаза. А наши глаза верят градиентам :) Давным давно была статейка о наших глазах. И приведены были "обманы" мозга для создания трехмерности) Там всего около 5-7 способов, причем наипростейший это градиенты.


Название: Re: Шарик
Отправлено: Igors от Декабрь 22, 2014, 19:17
Любая поделка будет работать с градиентами :D Ибо все технологии подстраиваются под глаза. А наши глаза верят градиентам :) Давным давно была статейка о наших глазах. И приведены были "обманы" мозга для создания трехмерности) Там всего около 5-7 способов, причем наипростейший это градиенты.
А зачем кого-то обманывать если можно просто посчитать как оно есть?  :)


Название: Re: Шарик
Отправлено: Bepec от Декабрь 22, 2014, 20:03
Вы в любом случае на выходе получаете фейковую картинку с градиентами, пусть и часто обновляемую.
Разница тут в том, что в opengl расчёты происходят автоматом.


Название: Re: Шарик
Отправлено: Igors от Декабрь 23, 2014, 12:46
Ну а почему бы нам не отрендерить сферу, т.е. повторить то что делает OpenGL? В конце-концов что же такого великого он делает? Или, как говорят в боевиках,

Цитировать
Даже не думай об этом!!
:) :)


Название: Re: Шарик
Отправлено: Пантер от Декабрь 23, 2014, 12:50
Обычно так и рождаются свои велосипеды. :)