LINUX.ORG.RU

Отрендерить в низком разрешении

 


0

1

Есть 3-мерная модель из нескольких сотен треугольников со скелетом. Требуется отрендерить её в спрайты 32х40 в разных позах и ракурсах. Как это сделать с минимумом усилий?

P.S. Для определённости — левая. Импортировать в Блендер — не проблема, а что дальше? Вручную раскрашивать в контрастные цвета? Повысить контрастность текстуры?

P.P.S. Опишу задачу подробнее. Пытаюсь сделать спрайты для изометрической тайловой игры (OpenXcom), взяв за основу модели, вырезанные из другой игры. (Некоммерческая пародия :) ) Модели содержат всего 1 текстуру на всю поверхность. Фон спрайтов прозрачный, в игре они накладываются на яркие фоновые тайлы. Всего нужно 8 ракурсов при 4 возможных положениях каждой руки и ног. То есть ручная доработка модели или сложная постобработка будут легче ручной обработки каждого спрайта.

P.P.P.S. Если рендерить в высоком разрешении, размазывать и уменьшать в 100 раз, результат не лучше.

P.P.P.P.S. На удивление хорошие результаты получаются, если увеличить ширину (X и Y без Z) моделей в 1.5-2 раза. Интересно, что именно таковы оказались пропорции на спрайтах оригинальной игры.

P.P.P.P.P.S. Полезно оказалось увеличивать насыщенность цвета текстур.

Итог:

Модели с человеческими пропорциям плохо подходят для рендеринга спрайтов 32 пикселя шириной с вытянутыми руками. Но если увеличить ширину модели в 1,5-2 раза, получится неплохой результат:

https://raw.githubusercontent.com/tkzv/looters/master/bssprites/asari-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/asari-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/batarian-m-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/batarian-m-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/krogan-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/krogan-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/quarian-f-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/quarian-m-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/salarian-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/salarian-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/turian-f-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/turian-f-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/turian-m-a.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/turian-m-u.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/varren.png
https://raw.githubusercontent.com/tkzv/looters/master/bssprites/vorcha.png

Полезно повысить насыщеность цветов. Во-первых, в самой текстуре — XPS хранят их отдельно, и Блендер по умолчанию тоже. Во-вторых, в результатах рендера. Для этого спрайты проще объединить в один файл. Мне больше всего нравится инструмент Levels в Гимпе. Иногда удобнее Saturation или Hue-Saturation. Для пакетной обработки при невысоких требованиях к качеству годится ImageMagick:

convert -colorspace HSL -channel G -evaluate multiply 5 infile outfile

Время от импорта модели в XPS до получения готовых 75 спрайтов (плюс ещё 3, которые я не стал выкладывать) — 1-2 часа, включая подбор цветов в Гимпе.

★★★★★

тебе же даже загуглить было лень, как ты тут читать будешь про то, что в настройках выставить размеррендера и камеру проанимировав можно получить нужное количество кадров с нужных ракурсов в нужном масштабе? Как ты прочитаешь про то, что можно настроить такую сцену и кидать в неё своих героев и рендерить?

Deleted ()
Ответ на: комментарий от Deleted

Если просто выставить размер рендера 30х40, из неконтрастной высокополигональной модели получается мешанина пикселей. Надо что-то делать с моделью. Есть что-нибудь проще, чем рисование новой?

P.S. А камеру в моём случае проще не двигать, а поставить сразу 8 и переключаться.

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 2)
Ответ на: комментарий от question4

Тут уж пример нужен, сходу не скажу. Мне видятся такие проблемы - Антиалиасинг, отключить его и все сглаживания. А если проблемы с контрастом, выделением деталей и контурами всякими - или настраивать материалы на модели, или настроить ноды сцены в которую кидаешь модельки. И тогда уж описал бывсе проблемы в посте, а не сцеживал пошагово.

Deleted ()

Посмотрел модельку -на ней и так много деталей, теней, и всё такое контрастное... Я бы сделал так - нода сцены - отблюрить модель и отрезать всё лишнее альфаконтуром. А потом повысить когтраст и резкость обратно.

Deleted ()
Ответ на: комментарий от Deleted

Антиалиасинг, отключить его и все сглаживания.

С этого начал.

настраивать материалы на модели,

На всю модель — 1 материал, 1 текстура. Точнее говоря, когда отключил все текстуры кроме главной, вид практически не изменился. Что это значит? Вручную выделять группы полигонов и присваивать им отдельные материалы? Можно ли их как-то выделять по цвету текстуры?

сцены в которую кидаешь модельки.

Вся сцена — шагающий в пустоте персонаж.

описал бы все проблемы в посте, а не сцеживал пошагово

Не знаю, что важно, а что загружает пост и мешает пониманию. Добавляю детали по мере выявления.

question4 ★★★★★ ()
Ответ на: комментарий от question4

Смари, создаём сцену с камерой и нодами постпроцессинга рендера. В нодах блюришь всё, обратно резким делаешь, обрезаешь края по альфаканалу оригинального героя и выход даунскейлишь в свои пиксели. В эту сцену бросаешь героя, рендеришь. Или тебе полный автоматизм?

Deleted ()
Ответ на: комментарий от Deleted

Попробовал.
Рендерю в 320х400 с альфа-каналом вместо фона,
затем Blur с параметрами Gaussian / x=5 / y=5,
полученное изображение прогоняю через Scale Absolute / x=32 / y=40,
параллельно через такой же Scale прогоняю альфа-канал исходного изображения,
собираю рисунок и альфа-канал в Composite.

Результат меня ещё не устраивает, но ближе к желаемому. Буду пробовать дальше, когда время появится.

Сразу вопросы:

Что даёт параметр Z?

При разных параметрах чёрные когти размером 1 пиксель то появляются то исчезают на разных пальцах ног. Куда оптимизировать, чтобы были на всех?

Какая разница между режимами blur-а? (Я только заметил, что при равных параметрах flat сильнее смазывает детали.) Что выбрать, чтобы сохранить шипы на локтях и когти?

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

При разных параметрах чёрные когти размером 1 пиксель то появляются то исчезают на разных пальцах ног. Куда оптимизировать, чтобы были на всех?

Какие тебе когти при размере 32х40? Да ещё при движении, на каждой картинке по разному будет. Тебе по любому придётся подрисовывать, а может и перерисовывать детали. Нету такого способа, чтобы автоматом за тебя всё сделало. Можешь написать ИИ и обучить его, какие элементы тебе нужны, что такое красиво, продашь, станешь милиардером.

Deleted ()
Ответ на: комментарий от Deleted

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

Попробовал с разными настройками. Итоговый результат несильно отличается чем если сразу рендерить в малое разрешение. Но рендеринг в разрешении 3200х4000 требует гораздо больше времени.

Или тебе полный автоматизм?

Раз уж речь об автоматизации, как автоматизировать переключение камер и сохранение? У меня 9 фреймов анимации и 8 камер, итого 72 кадра. И не менее 8 моделей. Требуется каждый кадр сохранить под уникальным номером. (Потом склею как здесь: https://www.ufopaedia.org/index.php/ETHEREAL.PCK ) Можно руками, но хотелось бы автоматизировать.

По каким словам искать в мануале?

question4 ★★★★★ ()
Ответ на: комментарий от question4

3200х4000

Зачем???

Итоговый результат несильно отличается

Зависит. Не видя сравнительного материала не особо смогу сказать.

У меня 9 фреймов анимации и 8 камер, итого 72 кадра

Или руками делать, или лучше продумать выходные ноды, или... Питон?

Deleted ()
Ответ на: комментарий от Deleted

3200х4000

Зачем???

Чем выше промежуточное разрешение, тем контрастнее выходило в итоге. Но всё равно серая мешанина.

Или руками делать, или лучше продумать выходные ноды, или... Питон?

А как с нодами? Там можно переключать камеры? Как это называется?

question4 ★★★★★ ()
Ответ на: комментарий от question4

А как с нодами?

Нашёл https://blender.stackexchange.com/questions/23154/how-to-combine-renders-from...

Но в примере используется Scale, чего я хотел бы избежать. Alpha Over берёт 2 изображения одинакового размера и накладывает их друг на друга. Итоговое изображение имеет тот же размер. А есть ли что-то подобное, что состыковывало бы несколько изображений, увеличивая итоговый?

question4 ★★★★★ ()
Ответ на: комментарий от question4

Создал 8 сцен, для каждой задал свою камеру, в режиме нод создал 8 пар Render Layer — File Output, каждый File Output направил в отдельную директорию, вручную переключал 9 фреймов, каждый раз нажимал F12. Осталось написать скрипт, который склеит их convert-ом из ImageMagic. Вопрос: как сделать блендерную часть в 1 нажатие вместо 18?

question4 ★★★★★ ()
Ответ на: комментарий от docpro

Украсть тестуру?

Где? Текстура из игры есть, и результат с нею не устраивает.

Проще проанализировать файл

Который? Игровой файл нормально импортируется плагином для Блендера.

или ловить вызовы АПИ

Зачем?

Мои вопросы — как пользоваться Блендером. Например, я не знал, что ноды позволяют обрабатывать несколько камер одновременно, а о назначении Alpha Over из названия не догадался бы.

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

Который? Игровой файл нормально импортируется плагином для Блендера.

Без текстур? Ну ищи как там запакованы текстуры. Ты хочешь сграббить отрендерринные текстуры?? Собственно, возникает вопрос, кто и как проигрывает твой ролик.

Мои вопросы — как пользоваться Блендером.

Лол.

docpro ()
Ответ на: комментарий от question4

Сделать скейл итоговой подложки? Например, берём изображение размером с итоговый, отправляем его на выходную ноду. Полностью прозрачное. И накладывай на него рендеры камер паралельно. (если я понятно объснил. мысли заплетаются)

Извини, что сразу не ответил, не заметил. И как-то долго ты мучаешься, уже давно бы руками всё нарисовал :)

Deleted ()
Последнее исправление: Chelobaka (всего исправлений: 1)
Ответ на: комментарий от Deleted

Например, берём изображение размером с итоговый, отправляем его на выходную ноду.

Спасибо, не сообразил.

И как-то долго ты мучаешься, уже давно бы руками всё нарисовал :)

Пару часов в неделю.

question4 ★★★★★ ()
Ответ на: комментарий от docpro

Без текстур?

С текстурами.

Ты хочешь сграббить отрендерринные текстуры?

Нет.

Собственно, возникает вопрос, кто и как проигрывает твой ролик.

Блендер :)

Ты не читал стартовый пост? :) Есть куча готовых моделей. Надо поточно превращать их в наборы спрайтов низкого разрешения.

question4 ★★★★★ ()
Ответ на: комментарий от question4

Приемлемое решение:

1. Сменить имена камер на «Camera-X», где X — число. Например, в Outliner.

2. В Properties -> Render Layers включить Views, переключить на Multi-View, добавить ещё 6 пунктов (итого 8). В каждом сменить «Camera Suffix» на один из "-X".

3. В Properties -> Render нажать Animation. Не пугаться анаглифных изображений на экране.

Либо пунктом 3 можно в питоновской консоли набрать bpy.ops.render.render(animation=True, write_still=True) Тогда анаглифов не будет.

Результат — 72 картинки «кадр-камера.png».

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 2)
Ответ на: комментарий от question4

4. Склейка:

montage -geometry '32x40+0+0' -tile '16x5' -background none 0004-* `for cam in {0..7} ; do echo 000{8,7,6,5,3,2,1,0}-$cam.png; done` death* sum.png
что эквивалентно
montage -geometry 32x40+0+0 -tile 16x5 -background none 0004-0.png 0004-1.png 0004-2.png 0004-3.png 0004-4.png 0004-5.png 0004-6.png 0004-7.png 0008-0.png 0007-0.png 0006-0.png 0005-0.png 0003-0.png 0002-0.png 0001-0.png 0000-0.png 0008-1.png 0007-1.png 0006-1.png 0005-1.png 0003-1.png 0002-1.png 0001-1.png 0000-1.png 0008-2.png 0007-2.png 0006-2.png 0005-2.png 0003-2.png 0002-2.png 0001-2.png 0000-2.png 0008-3.png 0007-3.png 0006-3.png 0005-3.png 0003-3.png 0002-3.png 0001-3.png 0000-3.png 0008-4.png 0007-4.png 0006-4.png 0005-4.png 0003-4.png 0002-4.png 0001-4.png 0000-4.png 0008-5.png 0007-5.png 0006-5.png 0005-5.png 0003-5.png 0002-5.png 0001-5.png 0000-5.png 0008-6.png 0007-6.png 0006-6.png 0005-6.png 0003-6.png 0002-6.png 0001-6.png 0000-6.png 0008-7.png 0007-7.png 0006-7.png 0005-7.png 0003-7.png 0002-7.png 0001-7.png 0000-7.png death1.png death2.png death3.png sum.png

В следующий раз надо шагать с другой ноги.

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 1)

Для повышения контрастности помогает расставить вокруг побольше источников освещения. Поставил вокруг модели 4 стандартных Hemi.

question4 ★★★★★ ()
Ответ на: комментарий от question4

2. В Properties -> Render Layers включить Views, переключить на Multi-View, добавить ещё 6 пунктов (итого 8). В каждом сменить «Camera Suffix» на один из "-X".

Не пугаться анаглифных изображений на экране.

Лучше добавить сразу 8 и отключить «left» и «right». Тогда анаглифов показывать не будет.

4.

При правильном порядке спрайтов команда упрощается:

montage -geometry '32x40+0+0' -tile '16x5' -background none 0004-* `for cam in {0..7} ; do echo 000{{0..3},{5..8}}-$cam.png; done` d* result.png

question4 ★★★★★ ()
Ответ на: комментарий от question4

Склейка гифов:

$ for camera in {0..7}; do montage -geometry '32x40+0+0' -tile '9x1' -background '#00ff00' 000*-$camera.png spinning-frame-$camera.gif; done

$ gifsicle -d 50 spinning-frame-*.gif --loopcount=forever > spinning.gif

$ for frame in {0..8}; do montage -geometry '32x40+0+0' -tile '8x1' -background '#00ff00' 000$frame-*.png walking-frame-$frame.gif; done

$ gifsicle -d 15 walking-frame-{0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1}.gif --loopcount=forever  > walking.gif 

question4 ★★★★★ ()
Ответ на: комментарий от question4

Полезный скрипт для настройки сразу всех камер:

for c in bpy.data.cameras:
    c.type = 'ORTHO'
    c.ortho_scale = 1.6
После этого с 2.3 метров при фокусном расстоянии 35 мм картинка того же размера, что и для дефолтной перспективной (c.type = 'PERSP') камеры.

Полезные советы:
Чтобы узнать команды API питона, можно провести требуемое действие вручную, переключить любую панель в Info и посмотреть, что там написалось.

При импорте моделей и удалении от них могут оставаться неиспользуемые материалы, текстуры, кисти и т.п. Их можно увидеть и удалить, переключив дерево Outliner на Blender File и Orphan Data. Иначе сохраняемый файл разрастается на полмегабайта на модель.

question4 ★★★★★ ()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

Склейка одиночных PNG с прозрачностью в GIF с фоном:

for fil in *.png; do convert -background '#00ff00' -flatten $fil $fil.gif; done ; gifsicle -d 1 *.png.gif --loopcount=forever > falling.gif
-alpha off вместо -flatten делает фон чёрным. Вне зависимости от цвета -background.

Лучшие кадры: 66, 72 74, 82, 90 91.

question4 ★★★★★ ()
Ответ на: комментарий от question4

То же, с увеличением насыщенности цветов:

for fil in 0*.png; do convert -colorspace HSL -channel G -evaluate multiply 5 $fil s$fil; convert -background '#ff00ff' -flatten s$fil t$fil.gif; done ; gifsicle -d 1 *.png.gif --loopcount=forever > falling.gif

Если применить HSL-G-evaluate и background-flatten в одной команде, цвет фона всегда отличается от заданного в background.

Интересно, в ImageMagic есть levels?

question4 ★★★★★ ()