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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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