SceneKit - Рисование масштабирующих кругов с одинаковой шириной линии в любом масштабе.
Я хочу рисовать масштабируемые анимированные круги с помощью SceneKit. Круги должны изменить свой радиус от (возможно) 100 до 200 в секунду. Можно увидеть только контур круга с шириной (случайное значение) пять.
Я рисую круги с помощью SCNShape и UIBezierPath. Масштабирование кругов не помогает, так как тогда изменяется и ширина контура. Изменение свойства SCNGeometry моего SCNNode для каждого кадра очень дорого, и я получаю 100% -ную загрузку ЦП, поэтому это тоже не работает.
У кого-нибудь есть идея, как лучше?
1 ответ
Здесь много вариантов. Протестируйте и профилируйте некоторые, чтобы увидеть, какой из них дает наилучший компромисс между желаемым визуальным эффектом и производительностью.
1. Используйте систему частиц
Рисование сотен кругов в секунду звучит очень похоже на систему частиц, особенно если их расположение соответствует определенной схеме. Установить particleImage
на растровое изображение круга (с достаточно высоким разрешением, при котором вы не получите пикселирование при масштабировании), и используйте контроллер свойств для анимации размера.
2. Система частиц BYO
Если SCNParticleSystem
не вписывается в счет, вы можете делать примерно то, что он делает - рисовать спрайты с щитами и регулировать их размер. Используйте SCNLookAtConstraint
повернуть плоскость к зрителю, нанести на нее текстуру круга и анимировать scale
содержащего узла.
3. Используйте параметрическую геометрию
Сделать SCNCylinder
или же SCNSphere
и преобразовать его так, чтобы круглое поперечное сечение было ориентировано на камеру. (Выровняйте это в других измерениях, если это имеет значение.) Чтобы заставить это расти, оживите узел scale
,
Чтобы отобразить только контур, используйте модификатор шейдера. Хороший способ получить эффект контура в коде шейдера - проверить точечное произведение направления обзора и нормали поверхности, рисуя цвет контура только тогда, когда они почти перпендикулярны.
Это немного поздно для вечеринки, но есть еще один хороший способ использовать SCNGeometrySource и SCNGeometryElement.
- Сгенерировать вершины
- Сгенерировать координаты текстуры
- Создавать индексы
- Установите материал (изображение, сплошной цвет и т. Д.)
- Анимируйте шкалу от 100 до 200
Я кратко изложил свой урок на случай, если он будет полезен кому-то еще.
https://gist.github.com/kemalenver/79523e5606f62c5958fcf5e9bedc48a5