SceneKit - Рисование масштабирующих кругов с одинаковой шириной линии в любом масштабе.

Я хочу рисовать масштабируемые анимированные круги с помощью SceneKit. Круги должны изменить свой радиус от (возможно) 100 до 200 в секунду. Можно увидеть только контур круга с шириной (случайное значение) пять.

Я рисую круги с помощью SCNShape и UIBezierPath. Масштабирование кругов не помогает, так как тогда изменяется и ширина контура. Изменение свойства SCNGeometry моего SCNNode для каждого кадра очень дорого, и я получаю 100% -ную загрузку ЦП, поэтому это тоже не работает.

У кого-нибудь есть идея, как лучше?

1 ответ

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

1. Используйте систему частиц

Рисование сотен кругов в секунду звучит очень похоже на систему частиц, особенно если их расположение соответствует определенной схеме. Установить particleImage на растровое изображение круга (с достаточно высоким разрешением, при котором вы не получите пикселирование при масштабировании), и используйте контроллер свойств для анимации размера.

2. Система частиц BYO

Если SCNParticleSystem не вписывается в счет, вы можете делать примерно то, что он делает - рисовать спрайты с щитами и регулировать их размер. Используйте SCNLookAtConstraint повернуть плоскость к зрителю, нанести на нее текстуру круга и анимировать scale содержащего узла.

3. Используйте параметрическую геометрию

Сделать SCNCylinder или же SCNSphere и преобразовать его так, чтобы круглое поперечное сечение было ориентировано на камеру. (Выровняйте это в других измерениях, если это имеет значение.) Чтобы заставить это расти, оживите узел scale,

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

Это немного поздно для вечеринки, но есть еще один хороший способ использовать SCNGeometrySource и SCNGeometryElement.

  1. Сгенерировать вершины
  2. Сгенерировать координаты текстуры
  3. Создавать индексы
  4. Установите материал (изображение, сплошной цвет и т. Д.)
  5. Анимируйте шкалу от 100 до 200

Я кратко изложил свой урок на случай, если он будет полезен кому-то еще.

https://gist.github.com/kemalenver/79523e5606f62c5958fcf5e9bedc48a5

Другие вопросы по тегам