Хочу научиться поворачивать спрайтики 16x16 на произвольный угол. Как это ловоче всего сделать?
Вид для печати
Хочу научиться поворачивать спрайтики 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
У тебя уже есть две похожие темы, зачем ещё то одну создавать.
поворот спрайтов 16*16 ересь несусветная
после поворота спрайт превращается в кашу
хорошо объясню проще
у тебя спрайт 16*16 итого 256 точек
убрать пустые останется ~128
проблема в том что
1 спрайт 16*16 после поворота на 35 градусов будет занимать 23х23 точки
2 из-за того что разрешение спрайта очень мелкое а спрайт черно белый точки налезут друг на друга и спрайт превратится в кашу
на цветном чуть получше но тоже не айс
я знаю я делал генератор набора спрайтов 16х16 с шагом где-то 1/64 потом ручками править надо много много
со спрайтами 32х32 уже лучше
а в демке condommed вообще крутят 2 спрайта 64х64 без особых напрягов
единственный более менее вариант увеличить в 4 раза, повернуть и потом уменьшить, но все равно не айс
каша будет!
я вращал растровые изображения 16x16
у меня каши не было:
переводил в вектор ( белые, черные квадраты ),
делал поворот,
пересчитывал сколько процентов белого попало в каждый пиксель,
и получалось из двухцветной картинки ( черный и белый цвет ) картинка с градациями серого. У меня было допустимо 16 градаций яркости серого.
Заранее генерил картинки для 256 углов поворота.
а на спектруме именно каша будет
Если вертеть 50 фпс, то искажения незаметны. См. лого в The Link. Там вообще целыми байтами шлёпается.
Поворот спрайта на произвольный угол - это частный случай двумерной интерполяции. Исходный спрайт можно представить как функцию двух переменных (поверхность), заданную таблично. Требуется найти значения этой функции в точках, которые будут пикселами нового спрайта. Проблема в том, что новые точки в общем случае не совпадают со старыми, поэтому значения функции в них не заданы. Единственный случай, когда точки совпадают - это поворот спрайта на угол, кратный 90 градусам.
Так вот, значения функции в новых точках не заданы, поэтому их приходится оценивать исходя из имеющихся значений этой функции в старых точках + некоторых представлениях о виде функции.
Самый простой случай - интерполяция ближайшим соседом. В качестве оценки значения функции используется ее значение в ближайшей точке, где оно задано. Такой метод дает результаты, которые выглядят примерно похоже на результат поворота исходного спрайта, но качество оставляет желать лучшего.
Второй часто используемый метод - линейная интерполяция. Это по результатам то же самое, что описал SpecialistMK87, но проще в реализации. Значения функции между точками, где оно задано, вычисляется в виде линейной комбинации от координат. Этот метод дает более высокое качество и реализован в большинстве современных видеокарт аппаратно.
Третий часто используемый метод - кубическая интерполяция. Он считается подходящим для высококачественной обработки изображений, хотя и он дает некоторое ухудшение качества.
Вышеописанные методы - линейный и кубический - а также другие более сложные методы двумерной интерполяции дают дробные значения для новых пикселов, а в случае Spectrum эти значения нужно округлять до 0 либо 1, что также вносит искажения. Поэтому, даже при использовании самых современных и теоретически обоснованных методов интерполяции, значительное ухудшение качества изображения при повороте неизбежно. При размере спрайта 16х16 я не вижу никаких перспектив в автоматическом повороте. То есть повернуть-то можно, но потом все равно придется руками править, чтобы получить хороший результат. Помню, как мы для игры Monty черепа вращающиеся рисовали - гемор был еще тот.
Если не в реальном времени - то вращать спрайты лучше всего в каком-нибудь фотошопе. Там реализованы современные методы обработки изображений.
Как много слов :)
При повороте спрайта 16х16 на угол менее 90 градусов он превращается в кашу.
так коротко и понятно :)
Коротко и понятно только для нелюбопытных, которые не интересуются, почему спрайт превращается в кашу, и нельзя ли что-нибудь с этим сделать. Но если человек нелюбопытный и удовлетворяется подобного рода простыми ответами - то никогда ему не шагнуть за черту неизведанного и не раздвинуть границы возможного.
Попробовал вчера средствами BGE сделать поворот с предварительным масштабированием. Для объектов с большим количеством деталей получается плохо. Т.е. никаких линий толщиной в пиксель и отдельно стоящих пикселей. Тогда будет лучше.
В каком-то из журналов была статья о повороте спрайта на угол, с последующей обработкой повернутого. Там даже примеры были
Так появился Диззи :-)Цитата:
Попробовал вчера средствами BGE сделать поворот с предварительным масштабированием. Для объектов с большим количеством деталей получается плохо. Т.е. никаких линий толщиной в пиксель и отдельно стоящих пикселей. Тогда будет лучше.
А кого же они поворачивали?:)Цитата:
Так появился Диззи :-)
Они в своем редакторе поворачивали спрайтик и пришли к тому же выводу, что и moroz1999.
Тогда братья придумали персонажа, который меньше всего портился при повороте.
Вы ошибаетесь так был изобретён колобок.:DЦитата:
Тогда братья придумали персонажа, который меньше всего портился при повороте.
Колобок на Спектруме не крутится, а Диззи крутится.