Если вы интересовались, казалось бы, бесконечными итерациями моих систем частиц на базе GPU для iOS, но немного боялись всего этого слегка загадочного стандартного кода Metal, вам может быть интересно узнать, что я наконец-то упаковал весь этот код Metal в Единый класс, позволяющий легко и просто реализовать высокопроизводительные системы частиц, как несколько строк кода для разработчиков Swift.
Мой новый класс называется ParticleLab , за исключением его шейдера Particles.metal , это единственное, что нужно скопировать в новый проект. Реализация супер проста: просто создать экземпляр:
let particleLab = ParticleLab()
Затем, когда вы будете готовы, добавьте его в качестве подслоя к слою вашего представления:
view.layer.addSublayer(particleLab)
ParticleLab допускает до четырех гравитационных скважин, которые имеют два свойства: массу и вращение . Первое определяет силу, с которой частицы притягиваются к гравитационному колодцу, а второе определяет, сколько частиц вращается вокруг него. Гравитационные скважины обычно не визуализируются, но их можно сделать видимыми (что может быть полезно во время разработки) с помощью простого флага:
particleLab.showGravityWellPositions = true
Каждый раз, когда ParticleLab выполняет шаг, вы можете захотеть выполнить какое-либо действие, например, обновить положение ваших гравитационных скважин. Чтобы сделать это, вы можете иметь класс реализации ParticleLabDelegate и установить себя в качестве экземпляра particleLabDelegate . Протокол содержит только один метод : icleLabDidUpdate ():
particleLab.particleLabDelegate = self
Для обновления гравитационных скважин ParticleLab предоставляет набор свойств GravityWellProperties . Для этого требуется перечисление GravityWell, чтобы определить, какую из четырех гравитационных скважин вы хотите обновить, за которыми следуют нормализованные позиции (0,0 — вверху слева и 1,1 — внизу справа), а также значения массы и вращения. Чтобы получить эффект в приведенном выше видео, мой метод elementLabDidUpdate () выглядит следующим образом:
var gravityWellAngle: Float = 0 let floatPi = Float(M_PI) func particleLabDidUpdate() { gravityWellAngle = gravityWellAngle + 0.01 particleLab.setGravityWellProperties(gravityWell: .One, normalisedPositionX: 0.5 + 0.1 * sin(gravityWellAngle + floatPi * 0.5), normalisedPositionY: 0.5 + 0.1 * cos(gravityWellAngle + floatPi * 0.5), mass: 11, spin: 13) particleLab.setGravityWellProperties(gravityWell: .Four, normalisedPositionX: 0.5 + 0.1 * sin(gravityWellAngle + floatPi * 1.5), normalisedPositionY: 0.5 + 0.1 * cos(gravityWellAngle + floatPi * 1.5), mass: 11, spin: 13) particleLab.setGravityWellProperties(gravityWell: .Two, normalisedPositionX: 0.5 + (0.35 + sin(gravityWellAngle * 1.7)) * cos(gravityWellAngle / 1.3), normalisedPositionY: 0.5 + (0.35 + sin(gravityWellAngle * 1.7)) * sin(gravityWellAngle / 1.3), mass: 26, spin: -16) particleLab.setGravityWellProperties(gravityWell: .Three, normalisedPositionX: 0.5 + (0.35 + sin(gravityWellAngle * 1.7)) * cos(gravityWellAngle / 1.3 + floatPi), normalisedPositionY: 0.5 + (0.35 + sin(gravityWellAngle * 1.7)) * sin(gravityWellAngle / 1.3 + floatPi), mass: 26, spin: -16) }
… и это в значительной степени это! Нет причин, по которым вы не могли бы контролировать гравитационные колодцы с помощью сенсорных событий или аудиопотока, чтобы получить удивительные эффекты.
ParticleLab в настоящее время жестко запрограммирован на 2 000 000 частиц и прекрасно работает на моем iPad Air 2 со скоростью 60 кадров в секунду. Я бы посчитал это бета-версией — все еще есть свойства, которые нужно раскрыть, и обработка ошибок, которые нужно добавить, но базовый движок металлических частиц довольно солидный. Я понятия не имею, насколько хорошо это будет играть встроено в другое приложение, особенно если это приложение довольно интенсивно.
Я бы очень хотел услышать о любых интересных проектах, использующих ParticleLab , пожалуйста, свяжитесь со мной через Twitter, где я @FlexMonkey .
Исходный код доступен в моем репозитории GitHub здесь . Наслаждайтесь!
Стоп Пресс! Первый совместный проект уже стартовал! Я работал с некоторыми из команды AudioKit над системой частиц, управляемой аудио, для визуализации звука. Используя их класс AKAudioAnalyzer для управления позициями, вращениями и массами гравитационных ям на основе микрофонного входа iPad, мы смогли собрать эту демонстрацию практически мгновенно :