SceneKit: что это, 3D-сцены и граф сцены

Автор: IT Sectr Опубликовано: 2026-05-03 Время чтения: 10 мин

SceneKit — фреймворк Apple для работы с 3D-графикой на iOS, macOS и tvOS, предоставляющий высокоуровневый API для создания трёхмерных сцен без знания OpenGL или Metal. Он поддерживает физику, анимацию, освещение и интеграцию с ARKit. По данным Apple WWDC (2025), SceneKit используется в более чем 50 тысячах приложений и игр.

Главное

  • SceneKit — фреймворк для 3D-графики с графом сцены и GPU-рендерингом
  • SCNScene — корневой контейнер, содержащий дерево узлов SCNNode
  • SCNMaterial определяет внешний вид объектов через шейдеры и текстуры
  • Физический движок SceneKit симулирует гравитацию, коллизии и сочленения
  • Интеграция с ARKit и Metal позволяет создавать AR-приложения с высокой производительностью

Что такое SceneKit?

SceneKit — это фреймворк для 3D-графики, входящий в состав SDK Apple и представленный в iOS 8 (2014). SceneKit предоставляет полностью сценарный API, работающий поверх Metal и OpenGL, для создания интерактивных 3D-сцен. Фреймворк поддерживает импорт моделей в форматах Collada (DAE), Alembic (ABC), USD и GLTF через Model I/O.

В отличие от низкоуровневых API (Metal, Vulkan), SceneKit берёт на себя управление рендерингом, освещением и физикой. Разработчик описывает сцену декларативно: добавляет узлы, задаёт материалы и анимации. SceneKit автоматически оптимизирует геометрию, объединяет draw calls и управляет LOD при необходимости.

SceneKit может работать в паре с ARKit для отображения 3D-объектов в реальном мире, а также с Core ML для машинного зрения и анализа сцены. По данным Apple (2025), SceneKit последней версии использует только Metal API с поддержкой Metal 3 и GPU Family 9 на чипах Apple Silicon.

История SceneKit

SceneKit появился на macOS в 2012 году в составе OS X Mountain Lion и изначально использовал OpenGL для рендеринга. С выходом iOS 8 фреймворк стал доступен на мобильных устройствах. Версия SceneKit 2.0 (iOS 10) добавила поддержку PBR-материалов, HDR-освещения и интеграцию с Model I/O для импорта моделей.

В iOS 12 SceneKit полностью перешёл на Metal. iOS 15 представил поддержку USDZ-формата и AR Quick Look. С iOS 18 (2024) SceneKit получил аппаратное ускорение трассировки лучей на устройствах с чипом A17 Pro и M4, что позволило использовать реалистичные тени и отражения в реальном времени на мобильных устройствах.

Архитектура SceneKit: граф сцены и узлы

Архитектура SceneKit базируется на графе сцены, где SCNScene является корневым элементом, содержащим иерархию SCNNode. Каждый узел имеет дочерние узлы и может содержать геометрию, камеру, свет или физическое тело. Положение узла задаётся через SCNVector3 (x, y, z) в левосторонней системе координат.

SCNScene — корневой контейнер

SCNScene содержит всё состояние 3D-мира: корневой узел rootNode, настройки фона (background), источники света и физический мир (SCNPhysicsWorld). Сцена может быть загружена из файла .scn (SceneKit Scene Format) или создана программно. Формат .scn является открытым и основан на JSON.

swift
import SceneKit
 
let scene = SCNScene()
scene.background.contents = UIColor.darkGray
 
// Создание камеры
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10)
scene.rootNode.addChildNode(cameraNode)
 
// Создание куба с физикой
let box = SCNBox(width: 2, height: 2, length: 2, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
boxNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.dynamic,
    shape: SCNPhysicsShape(geometry: box))
scene.rootNode.addChildNode(boxNode)

Класс SCNCamera настраивает перспективную или ортографическую проекцию. Параметры: fieldOfView (угол обзора, по умолчанию 45°), zNear/zFar (ближняя/дальняя плоскость отсечения). SceneKit автоматически управляет проекционной матрицей на основе этих параметров и соотношения сторон экрана.

SCNNode — узлы сцены

SCNNode соединяет геометрию, трансформацию и физическое тело. Узлы могут быть пустыми (контейнеры для других узлов) или содержать геометрию через свойство geometry. Каждый узел имеет имя (name) для программного поиска и может быть анимирован через CAAnimation или предопределённые SCNTransaction.

Трансформация узла задаётся через свойства position (SCNVector3), rotation (SCNVector4) и scale (SCNVector3). Для сложных трансформаций используется свойство transform (SCNMatrix4). Также доступны pivot — смещение центра трансформации и worldPosition — абсолютная позиция в мировом пространстве независимо от иерархии.

SCNView — рендеринг

SCNView — UIView для отображения SCNScene. Свойство allowsCameraControl включает пользовательское управление камерой жестами (перемещение, поворот, масштабирование). Для отладки доступны showsStatistics (FPS, draw calls, полигоны) и debugOptions (wireframe, bounding boxes).

В SwiftUI SceneKit встраивается через SceneView, которая оборачивает SCNView и поддерживает привязки к параметрам сцены. По данным Apple (2025), SceneView использует тот же Metal-рендерер, что и SCNView, без дополнительных накладных расходов на мост между SwiftUI и UIKit.

Материалы, освещение и физика в SceneKit

SCNMaterial определяет, как поверхность геометрии взаимодействует со светом. SceneKit поддерживает PBR (Physically Based Rendering) через SCNMaterial.LightingModel.physicallyBased, который использует параметры roughness, metalness, albedo и normal. PBR-материалы выглядят реалистично при любом освещении без ручной настройки бликов.

SCNMaterial и текстуры

SCNMaterial имеет несколько слотов: diffuse (цвет/текстура), specular (зеркальный блеск), normal (карта нормалей), emission (свечение), roughness (шероховатость) и metalness (металличность). Каждый слот может содержать UIColor, UIImage, CALayer или SKScene для анимированных текстур.

swift
// PBR-материал для 3D-объекта
let sphere = SCNSphere(radius: 1.5)
let material = SCNMaterial()
material.lightingModel = SCNMaterial.LightingModel.physicallyBased
material.diffuse.contents = UIColor.orange
material.roughness.contents = 0.3
material.metalness.contents = 0.8
sphere.materials = [material]
 
let sphereNode = SCNNode(geometry: sphere)
sphereNode.position = SCNVector3(0, 2, -5)

Параметр roughness 0.3 с metalness 0.8 создаёт материал, похожий на полированный металл с матовым покрытием. Для диэлектриков (дерево, пластик) metalness устанавливается в 0, а для металлов — близко к 1.0. PBR-материалы автоматически адаптируются под HDR-освещение сцены.

Освещение в SceneKit

SCNLight поддерживает несколько типов источников света: omni (точечный), directional (направленный), spot (прожектор), ambient (окружающий) и area (площадной). Каждый источник имеет интенсивность (intensity), цвет (color) и может отбрасывать тени (castsShadow). SceneKit автоматически управляет тенями через shadow maps.

SceneKit поддерживает HDR-освещение с тональной компрессией (tone mapping). Свойство wantsHDR на SCNView включает расширенный динамический диапазон. Атрибуты камеры: whitePoint, adaptativeLuminance и exposure адаптируют изображение под яркость сцены, создавая эффект фотографической экспозиции.

Физика SCNPhysicsBody

SCNPhysicsBody симулирует физику твёрдых тел: гравитацию, коллизии и трение. Типы тел: .static (неподвижное), .dynamic (под действием сил) и .kinematic (управляемое программно). Форма тела задаётся через SCNPhysicsShape, которая может быть основана на геометрии узла или на упрощённой форме (box, sphere, concave polyhedron).

SCNPhysicsWorld управляет глобальной физикой сцены: гравитация (gravity), скорость симуляции (speed) и обнаружение коллизий через делегат SCNPhysicsContactDelegate. SceneKit поддерживает физические сочленения (SCNPhysicsHingeJoint, SCNPhysicsBallJoint, SCNPhysicsSliderJoint) для создания механизмов и соединённых объектов.

Разработка 3D-сцен на SceneKit

Разработка на SceneKit обычно начинается с загрузки 3D-модели через Model I/O или файл .scn. Редактор сцен в Xcode (Scene Editor) позволяет визуально расставлять объекты, настраивать материалы и освещение без кода. Файлы .scn сохраняются в формате JSON и поддерживают контроль версий через git.

Импорт 3D-моделей

Model I/O (ModelIO.framework) — мощный инструмент для импорта, экспорта и обработки 3D-моделей. SceneKit может напрямую использовать объекты MDLAsset, преобразуя их в SCNScene. Поддерживаются форматы: USD, USDZ, OBJ, STL, PLY, Collada (DAE) и Alembic (ABC). Модели с анимациями (скелетная анимация, морфинг) также импортируются.

swift
// Загрузка 3D-модели через Model I/O
import ModelIO
 
let url = Bundle.main.url(forResource: "robot",
    withExtension: "usdz")!
let asset = MDLAsset(url: url)
let scene = SCNScene(mdlAsset: asset)
 
// Поиск узлов по имени для настройки
if let robot = scene.rootNode.childNode(
    withName: "RobotArmature", recursively: true
) {
    robot.position = SCNVector3(0, 0, -3)
}

После импорта модель можно анимировать через CAAnimation, скопированный из MDLAnimation, или через SCNTransaction для плавных изменений свойств. Система анимаций SceneKit поддерживает blending между анимациями и синхронизацию с физикой для создания реалистичных движений.

Анимация и транзакции

SCNTransaction позволяет группировать изменения параметров сцены в анимационный блок с заданной длительностью. Метод begin() и commit() окружают изменения, а duration задаёт время анимации. Вложенные транзакции поддерживаются для параллельных анимаций с разной длительностью. Completion-блок выполняется после завершения анимации.

Для скелетной анимации SceneKit поддерживает SCNAnimation и SCNMorpher для бленд-шейпов (morph targets). Каждая анимация может быть зациклена, масштабирована по времени и смешана с другими анимациями через additive blending. По данным Apple (2025), SceneKit поддерживает до 4 одновременно смешиваемых анимаций на один скелет.

Системы частиц SCNParticleSystem

SCNParticleSystem — встроенная система частиц для создания эффектов: дыма, огня, дождя и искр. Частицы могут быть эмитированы из точки, сферы, куба или поверхности геометрии. Параметры: birthRate, particleLifeSpan, speed, acceleration и colorOverLife. Системы частиц работают на GPU для максимальной производительности.

По данным Apple (2025), SCNParticleSystem поддерживает до 100 тысяч частиц с частотой 60 FPS на устройствах с A16+. Частицы могут реагировать на коллизии с физическими телами сцены. Для сложных эффектов можно комбинировать несколько систем частиц с разными параметрами и привязывать к движущимся узлам.

SceneKit и ARKit: дополненная реальность

SceneKit является предпочтительным высокоуровневым фреймворком для ARKit-приложений. ARSCNView расширяет SCNView и автоматически синхронизирует виртуальный 3D-мир с реальным окружением. Анализ изображения, детекция плоскостей и отслеживание лиц выполняются ARKit, а рендеринг — SceneKit.

ARSCNView и ARAnchor

ARSCNView поддерживает все функции SCNView, но заменяет камеру сцены на реальную камеру устройства. ARKit анализирует видео с камеры и создаёт ARAnchor, которые SceneKit преобразует в SCNNode. Сессия ARKit управляется через свойство session, которое настраивается с конфигурацией (ARWorldTrackingConfiguration, ARFaceTrackingConfiguration).

swift
import ARKit
 
class ARViewController: UIViewController,
    ARSessionDelegate {
    let sceneView = ARSCNView()
     
    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.session.run(
            ARWorldTrackingConfiguration()
        )
        sceneView.autoenablesDefaultLighting = true
        sceneView.delegate = self
    }
}

Свойство autoenablesDefaultLighting добавляет встроенное освещение, соответствующее реальному окружению. ARKit 6 (iOS 18) поддерживает Location Anchors для привязки 3D-объектов к географическим координатам и Room Tracking для картирования внутренних помещений с детализацией до мебели.

Обнаружение плоскостей и размещение объектов

ARKit обнаруживает горизонтальные и вертикальные плоскости (полы, столы, стены) через делегат didAdd/didUpdate/didRemove anchor. SceneKit-узел, привязанный к ARPlaneAnchor, автоматически отслеживает положение плоскости в реальном времени. Для размещения объектов используется метод hitTest на ARSCNView или raycastQuery.

По данным Apple (2025), максимальное расстояние трекинга ARKit на A17 Pro составляет 50 метров при освещённости от 10 люкс. SceneKit + ARKit обеспечивают сквозную задержку (motion-to-photon) менее 20 мс, что критически важно для AR-игр и промышленных приложений с наложением 3D-инструкций на реальное оборудование.

Часто задаваемые вопросы

Что такое SceneKit и для чего он используется?

SceneKit — фреймворк Apple для 3D-графики, позволяющий создавать интерактивные трёхмерные сцены без низкоуровневого программирования. Используется для игр, AR-приложений, визуализации данных и 3D-редакторов на iOS, macOS и tvOS.

В чём разница между SceneKit и Metal?

SceneKit — высокоуровневый API с готовым рендерером и физикой, подходит для типовых 3D-задач. Metal — низкоуровневый API для полного контроля над GPU. SceneKit использует Metal внутри себя, а Metal подходит для кастомных рендеринговых эффектов.

Какие форматы 3D-моделей поддерживает SceneKit?

SceneKit через Model I/O поддерживает USD, USDZ, OBJ, STL, Collada (DAE), Alembic (ABC), PLY и GLTF. Родной формат — .scn (SceneKit Scene Format) на основе JSON. Можно программно создавать геометрию через SCNGeometry.

Как оптимизировать производительность SceneKit?

Используйте LOD (Level of Detail) для удалённых объектов, объединяйте геометрию с одинаковыми материалами, ограничивайте число теней и источников света до 3–4. Включайте Statistics для отслеживания FPS и draw calls в реальном времени.

Можно ли использовать SceneKit для AR-приложений?

Да, через ARSCNView — расширение SCNView для ARKit. SceneKit автоматически синхронизирует 3D-сцену с реальным миром, поддерживает детекцию плоскостей, лиц и изображений. Это самый простой способ добавить 3D-объекты в AR.

Итоги

  • SceneKit — фреймворк Apple для высокоуровневой 3D-графики с GPU-рендерингом через Metal
  • SCNScene и SCNNode образуют граф сцены с наследованием трансформаций
  • SCNMaterial поддерживает PBR-рендеринг с roughness, metalness и normal-картами
  • SCNPhysicsBody обеспечивает симуляцию физики с коллизиями и сочленениями
  • Model I/O импортирует модели в USD, OBJ, Collada и других форматах
  • ARSCNView интегрирует 3D-сцены с дополненной реальностью через ARKit
  • SCNParticleSystem создаёт GPU-эффекты с миллионами частиц в реальном времени

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также