2015-01-03 5 views
3

Я только что влюбился в мир Металла, и я подумал, что у меня это получилось! Но потом мне пришло в голову, что если я захочу сделать игру, то статических объектов, перемещающихся по экрану, будет недостаточно. Поэтому мой вопрос: «Можно ли создавать анимации для моделей с помощью Металла?»Анимация персонажей с металлом

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

Единственный способ, которым я могу думать о том, как бы я это сделал, - создать 60 разных моделей, а затем загрузить каждый из них один за другим, чтобы дать эффект «остановки движения», но я подумайте, что это, вероятно, будет невероятно неэффективным, и надеялся, что есть более легкий ответ?

Большое спасибо!

+0

FIY: Scene Kit * делает * Поддержка как скелетная анимация, пользовательские шейдеры, и предоставление многоходовых. Однако это правда, что они не так сильны, как Металл. –

ответ

5

Да, есть другие, более эффективные способы сделать анимацию. Но прежде чем вдаваться в это, предупреждение: похоже, что вы лаем по неправильному дереву здесь.

Металл - это (концептуально) интерфейс очень низкого уровня. Вы используете Metal для разговора (почти) непосредственно на GPU, поэтому для работы с ним вам нужно думать (вроде), как графический процессор: с точки зрения буферов данных, преобразований вершин и т. Д. Вы, кажется, работаете на гораздо более высоком уровне концептуальный уровень, поэтому вам, вероятно, лучше всего помогает один из высокоуровневых игровых движков: SpriteKit для 2D или SceneKit для 3D. (Или сторонний движок, такой как Cocos или Unity.) Металл, с другой стороны, лучше подходит для создания этих игровых движков.

SpriteKit и SceneKit do поддержка шейдеров. Посмотрите на SKShader и SCNShadable в документах (и не забудьте щелкнуть ссылку «Больше», чтобы прочитать полный обзор). SceneKit также поддерживает анимацию персонажей (например, скелетную анимацию, а также скиннинг): как правило, один разрабатывает и создает модель для анимации во внешнем инструменте разработки (Maya, Blender и т. Д.), А затем использует SceneKit для работы с анимациями во время выполнения.

В Металле можно делать такие вещи, как скелетная анимация на основе графического процессора. Но я еще не видел никаких учебников или подобных писем, вероятно, потому, что Metal - это новая технология. По сути, это было бы основано на тех же самых методах, которые вы использовали бы для скелетной анимации в OpenGL или Direct3D, - и многое было написано об анимации для этих технологий. Если вы готовы вкладывать время и энергию в работу на низком уровне, адаптация предмета из учебников GL/D3D относительно проста.

+0

Эй! Спасибо за информацию! Для того, чтобы все было правильно, если бы я использовал Металл, мне пришлось бы программировать в скелетной анимации с нуля, чтобы сделать персонаж оживленным? В очередной раз благодарим за помощь! –

+0

Да, вам придется написать свой собственный код скелетной анимации на основе металла. (Если вы не используете сторонний, основанный на металле, высокоуровневый игровой движок, такой как Unreal или Unity **, и ** сказал, что у двигателя есть своя поддержка для скелетной анимации.) – rickster

+0

@ rickster Можно ли окунуться в скелет символ в «SceneKit» с использованием Metal Shader? – ColdSteel

1

Вы можете сделать скелетную анимацию в Metal, SCNKit будет использовать GPU для деформирования сетки. Но для этого в Металле вам нужно будет переносить веса кожи, а также костные матрицы для позы и привязки костей по мере их оживления, а затем вычислять новые позиции вершин на их основе. На самом деле, я думаю, вам нужно обратное к матрицам позывных связей. Затем каждая вершина сетки преобразуется взвешенной суммой преобразований, продиктованных весами кожи.

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

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

Наверное, проще придерживаться SceneKit и позволить яблоку заботиться обо всем остальном или использовать существующий игровой движок, такой как Unity.

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

0

SceneKit поддерживает шейдеры. И объект, который управляет отношениями между скелетными анимациями и узлами и геометриями, которые они оживляют, - SCNSkinner из SceneKit.

Как правило, вам необходимо создать скин-модель, используя, например, Autodesk Maya, сохраните ее вместе с анимацией, использующей скелет, в файле сцены. Вы загружаете модель из файла сцены, создаете или анимируете ее в своем приложении, либо используя объекты анимации, также загруженные из файла сцены, либо напрямую манипулируя узлами в скелете. Вот и все.

Смотреть это видео с 7 частями about Blender's skeletal system and how to use it in SceneKit.

enter image description here

convenience init(baseGeometry: SCNGeometry?,    //character 
       bones: [SCNNode],      //array of bones 
       boneInverseBindTransforms: [NSValue]?, //ibt of matrix4 
       boneWeights: SCNGeometrySource,   //influence on geometry 
       boneIndices: SCNGeometrySource   //index mapping 
       ) 
Смежные вопросы