PDA

Просмотр полной версии : Поворот спрайта



Soplik
26.09.2011, 01:27
Хочу научиться поворачивать спрайтики 16x16 на произвольный угол. Как это ловоче всего сделать?

Titus
26.09.2011, 01:50
Хочу научиться поворачивать спрайтики 16x16 на произвольный угол. Как это ловоче всего сделать?
В реалтайме - очень медленно. Легче заготовить уже повернутые.

Destr
26.09.2011, 09:44
Хочу научиться поворачивать спрайтики 16x16 на произвольный угол. Как это ловоче всего сделать?
Вот тут что-то такое:
http://www.zxpress.ru/article.php?id=7903 (примерно с 1/3 статьи начинается).
http://zxpress.ru/article.php?id=7876
http://zxpress.ru/article.php?id=9228

DimkaM
26.09.2011, 09:46
У тебя уже есть две похожие темы, зачем ещё то одну создавать.

jerri
26.09.2011, 14:25
поворот спрайтов 16*16 ересь несусветная
после поворота спрайт превращается в кашу

Andrew771
26.09.2011, 16:06
поворот спрайтов 16*16 ересь несусветная
после поворота спрайт превращается в кашу
С какой это стати? Если правильно рассчитать координаты в векторной графике (синусы-косинусы всякие), то всё нормально будет. Другое дело, что очень много времени займет.

jerri
26.09.2011, 16:36
С какой это стати? Если правильно рассчитать координаты в векторной графике (синусы-косинусы всякие), то всё нормально будет. Другое дело, что очень много времени займет.

хорошо объясню проще

у тебя спрайт 16*16 итого 256 точек
убрать пустые останется ~128
проблема в том что
1 спрайт 16*16 после поворота на 35 градусов будет занимать 23х23 точки
2 из-за того что разрешение спрайта очень мелкое а спрайт черно белый точки налезут друг на друга и спрайт превратится в кашу
на цветном чуть получше но тоже не айс

я знаю я делал генератор набора спрайтов 16х16 с шагом где-то 1/64 потом ручками править надо много много
со спрайтами 32х32 уже лучше
а в демке condommed вообще крутят 2 спрайта 64х64 без особых напрягов

единственный более менее вариант увеличить в 4 раза, повернуть и потом уменьшить, но все равно не айс

Andrew771
26.09.2011, 16:42
единственный более менее вариант увеличить в 4 раза, повернуть и потом уменьшить, но все равно не айс
Дык вот, вся проблема с округлениями чисел (если ты делал по формулам векторной графики, а не простой пересчет пикселов, как многие предлагают). Просто когда увеличиваешь в 4 раза, то повышаешь точность.

SpecialistMK87
26.09.2011, 17:13
каша будет!

я вращал растровые изображения 16x16

у меня каши не было:

переводил в вектор ( белые, черные квадраты ),
делал поворот,
пересчитывал сколько процентов белого попало в каждый пиксель,

и получалось из двухцветной картинки ( черный и белый цвет ) картинка с градациями серого. У меня было допустимо 16 градаций яркости серого.

Заранее генерил картинки для 256 углов поворота.

а на спектруме именно каша будет

jerri
26.09.2011, 17:35
Дык вот, вся проблема с округлениями чисел (если ты делал по формулам векторной графики, а не простой пересчет пикселов, как многие предлагают). Просто когда увеличиваешь в 4 раза, то повышаешь точность.

вся проблема именно в том что каждый пиксель размазывается по 4м точкам вместо одной
и тут надо считать какая из этих 4х будет новой точкой

Andrew771
26.09.2011, 17:41
вся проблема именно в том что каждый пиксель размазывается по 4м точкам вместо одной
и тут надо считать какая из этих 4х будет новой точкой
угу.

alone
26.09.2011, 18:16
Если вертеть 50 фпс, то искажения незаметны. См. лого в The Link. Там вообще целыми байтами шлёпается.

SpecialistMK87
26.09.2011, 19:56
вся проблема именно в том что каждый пиксель размазывается по 4м точкам вместо одной
и тут надо считать какая из этих 4х будет новой точкой
именно так все и есть. Но этого не поймут пока сами не попробуют

Barmaley_m
30.09.2011, 09:43
Поворот спрайта на произвольный угол - это частный случай двумерной интерполяции. Исходный спрайт можно представить как функцию двух переменных (поверхность), заданную таблично. Требуется найти значения этой функции в точках, которые будут пикселами нового спрайта. Проблема в том, что новые точки в общем случае не совпадают со старыми, поэтому значения функции в них не заданы. Единственный случай, когда точки совпадают - это поворот спрайта на угол, кратный 90 градусам.

Так вот, значения функции в новых точках не заданы, поэтому их приходится оценивать исходя из имеющихся значений этой функции в старых точках + некоторых представлениях о виде функции.

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

Второй часто используемый метод - линейная интерполяция. Это по результатам то же самое, что описал SpecialistMK87, но проще в реализации. Значения функции между точками, где оно задано, вычисляется в виде линейной комбинации от координат. Этот метод дает более высокое качество и реализован в большинстве современных видеокарт аппаратно.

Третий часто используемый метод - кубическая интерполяция. Он считается подходящим для высококачественной обработки изображений, хотя и он дает некоторое ухудшение качества.

Вышеописанные методы - линейный и кубический - а также другие более сложные методы двумерной интерполяции дают дробные значения для новых пикселов, а в случае Spectrum эти значения нужно округлять до 0 либо 1, что также вносит искажения. Поэтому, даже при использовании самых современных и теоретически обоснованных методов интерполяции, значительное ухудшение качества изображения при повороте неизбежно. При размере спрайта 16х16 я не вижу никаких перспектив в автоматическом повороте. То есть повернуть-то можно, но потом все равно придется руками править, чтобы получить хороший результат. Помню, как мы для игры Monty черепа вращающиеся рисовали - гемор был еще тот.

Если не в реальном времени - то вращать спрайты лучше всего в каком-нибудь фотошопе. Там реализованы современные методы обработки изображений.

jerri
30.09.2011, 10:53
Как много слов :)

При повороте спрайта 16х16 на угол менее 90 градусов он превращается в кашу.
так коротко и понятно :)

Barmaley_m
01.10.2011, 02:43
Коротко и понятно только для нелюбопытных, которые не интересуются, почему спрайт превращается в кашу, и нельзя ли что-нибудь с этим сделать. Но если человек нелюбопытный и удовлетворяется подобного рода простыми ответами - то никогда ему не шагнуть за черту неизведанного и не раздвинуть границы возможного.

Vitamin
01.10.2011, 14:46
Попробовал вчера средствами BGE сделать поворот с предварительным масштабированием. Для объектов с большим количеством деталей получается плохо. Т.е. никаких линий толщиной в пиксель и отдельно стоящих пикселей. Тогда будет лучше.

GM BIT
03.10.2011, 20:20
В каком-то из журналов была статья о повороте спрайта на угол, с последующей обработкой повернутого. Там даже примеры были

Soplik
03.10.2011, 21:26
Попробовал вчера средствами BGE сделать поворот с предварительным масштабированием. Для объектов с большим количеством деталей получается плохо. Т.е. никаких линий толщиной в пиксель и отдельно стоящих пикселей. Тогда будет лучше.
Так появился Диззи :-)

NEO SPECTRUMAN
03.10.2011, 21:38
Так появился Диззи :-)
А кого же они поворачивали?:)

Soplik
03.10.2011, 21:44
Они в своем редакторе поворачивали спрайтик и пришли к тому же выводу, что и moroz1999.
Тогда братья придумали персонажа, который меньше всего портился при повороте.

NEO SPECTRUMAN
03.10.2011, 21:51
Тогда братья придумали персонажа, который меньше всего портился при повороте.
Вы ошибаетесь так был изобретён колобок.:D

Soplik
03.10.2011, 21:53
Колобок на Спектруме не крутится, а Диззи крутится.