Рендеринг символов с отрезанными конечностями (модели Blender в Java / OpenGL)

10

Какие аспекты я должен принять во внимание при создании анимации персонажей и классов рендеринга, если я хочу иметь возможность отрывать конечности? Я разработал детальную систему тела, в которой можно определить все, вплоть до нервной системы. Я стремлюсь к чему-то похожему на уровень детализации урона, найденный в Dwarf Fortress. Например, когда персонаж получает повреждение своей верхней руки, есть вероятность повреждения нерва, которое может отключить всю руку. Или они могут полностью потерять руку.

У меня есть система, написанная для обработки части данных этого. У каждого персонажа есть ствол, который имеет придатки и внутренние части. Каждый придаток также может иметь дочерние придатки и внутренние части. Дочерние придатки отключены / удалены, если родительский придаток отключен / удален. Если какой-либо из отключенных / удаленных придатков или внутренних частей потребуется для жизни, персонаж скоро умрет.

То, над чем я сейчас работаю, это рисование / анимация. Как определить анимации, чтобы узнать, какие из них разрешены с учетом текущего состояния тела (отсутствие рук / ног и т. Д.)? Как настроить систему рисования, чтобы не рисовать недостающие конечности? Должна ли каждая конечность / придаток быть своей собственной моделью (я хотел бы нарисовать отрезанные отростки на земле)?

Простая система, из которой я перехожу (я только что написал ее для тестирования), импортирует все ключевые кадры анимации в виде полных моделей в VBO (вместе с количеством вершин, где ключевые кадры начинаются / останавливаются). Он не импортирует и не использует кости, определенные в Blender, и не интерполирует между кадрами.

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

РЕДАКТИРОВАТЬ

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

MichaelHouse
источник

Ответы:

7

В настоящее время я работаю над аналогичной системой. Процедурная анимация + расчленение и т. Д.

Как определить анимации, чтобы узнать, какие из них разрешены для текущего состояния тела (отсутствующие руки / ноги и т. Д.)?

Я не совсем слежу за этим, если конечностей нет, то кого это волнует, анимируется он или нет, потому что его не видно.

Должна ли каждая конечность / придаток быть своей собственной моделью (я хотел бы нарисовать отрезанные отростки на земле)?

Я строю их динамически, используя веса вершинных костей. Качество, вероятно, немного ниже, чем при выполнении каждой конечности вручную, но после того, как я это сделал один раз, затрачивается меньше усилий, потому что затем я могу применить его к каждой модели.

При здравом подходе из следующего раздела, да, каждая конечность будет иметь свою собственную модель.

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

Как настроить систему рисования, чтобы не рисовать недостающие конечности?

2 основных варианта, самый простой способ - просто нарисовать конечности по отдельности, и там, где конечности соединяются, есть дополнительные грани, которые обычно скрыты текстурами «сырой плоти», которые будут видны при удалении конечностей.

Второй вариант - делать это динамически на лету, это будет работать только с относительно простыми моделями. Подход заключается в том, чтобы взять базовую модель и найти вершины, взвешенные до конечности, которую вы хотели расчленить. Удалите эти вершины, отметив, с чем они связаны, так что вы знаете открытый раздел. Затем вы динамически закрываете открытую секцию треугольниками с текстурой «сырая плоть». С точки зрения здравомыслящего разработчика программного обеспечения, этот подход не является хорошим (деформация модели во время выполнения) и менее «плоскими» характеристиками производительности, но мне это нравится.

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

Лично я иду со вторым, с относительным успехом, но все мои модели очень низкополигональны, так что динамическое разделение модели и повторная загрузка VBO в кадре пока выполнимо.

Он не импортирует и не использует кости, определенные в Blender, и не интерполирует между кадрами.

Это действительно затрудняет расчленение процедурным способом, потому что как вы узнаете, какие вершины принадлежат какому соединению? Вес вершины кости и расчленение идут рука об руку, так что приятно предложить вам переосмыслить это.

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

Майкл
источник
Спасибо, Михаил. Я поднял интерполяцию и импортировал кости, потому что я знаю, что они мне понадобятся, но у меня их пока нет. Из того, что вы сказали, похоже, я буду знать, что делать, когда доберусь до этой точки. Вероятно, я бы просто связал придаток или группу придатков с костью. Я задам отдельный вопрос об импорте костей.
MichaelHouse
поскольку вы работаете над чем-то похожим, возможно, у вас есть больше информации по этому связанному вопросу? gamedev.stackexchange.com/q/20931/7191
MichaelHouse
5

Лучший вариант - отрезать конечности и использовать несколько подмоделей в зависимости от текущего состояния ран. Ваш подход к использованию VBO для каждого ключевого кадра просто излишний; использовать систему скелетной анимации и воспроизводить различные анимации в зависимости от полученного урона (хромать одной ногой, ползать без двух ног и т. д.).

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

r2d2rigo
источник
Интересно. Эти слайды выглядят хорошо. Кажется, это сработало бы для повреждения, которое не затронуло весь придаток.
MichaelHouse