Разбираемся с SceneKit на примерах

SceneKit — это высокоуровневый фреймворк для разработки 3D графики на iOS, macOS и tvOS. Он позволяет работать с трехмерными объектами, сценами, светом и камерой, предоставляя удобные API для рендеринга сложных 3D-сцен. SceneKit идеально подходит для создания игр, приложений с дополненной реальностью (AR) и различных интерактивных приложений с 3D-контентом.

Основные возможности SceneKit:

  • Создание 3D объектов: С помощью встроенных примитивов, таких как сферы, кубы, цилиндры и другие.
  • Импорт 3D моделей: Можно импортировать модели из файлов форматов .dae, .obj, .usdz и других.
  • Анимация объектов: SceneKit поддерживает анимацию через ключевые кадры или физику.
  • Свет и тени: Добавляйте источники света и настройте тени для создания реалистичных сцен.
  • Камера: Управляйте положением и настройками камеры для просмотра сцены под разными углами.
  • Физический движок: SceneKit поддерживает физические взаимодействия, включая столкновения и силы.

Пример использования SceneKit

Создадим простую 3D-сцену с кубом, камерой и светом:

import SceneKit
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Создаем SCNView — контейнер для отображения сцены
        let sceneView = SCNView(frame: self.view.frame)
        self.view.addSubview(sceneView)
        
        // Создаем сцену
        let scene = SCNScene()
        sceneView.scene = scene
        
        // Настраиваем камеру
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
        scene.rootNode.addChildNode(cameraNode)
        
        // Добавляем свет
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light?.type = .omni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)
        
        // Добавляем тень
        let ambientLightNode = SCNNode()
        ambientLightNode.light = SCNLight()
        ambientLightNode.light?.type = .ambient
        ambientLightNode.light?.color = UIColor.darkGray
        scene.rootNode.addChildNode(ambientLightNode)
        
        // Создаем куб
        let boxGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
        let boxNode = SCNNode(geometry: boxGeometry)
        scene.rootNode.addChildNode(boxNode)
        
        // Добавляем анимацию поворота куба
        let rotate = SCNAction.rotate(by: .pi, around: SCNVector3(0, 1, 0), duration: 1)
        let repeatAction = SCNAction.repeatForever(rotate)
        boxNode.runAction(repeatAction)
        
        // Настраиваем параметры отображения
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.backgroundColor = UIColor.black
    }
}

Пример использования физического движка SceneKit

import SceneKit
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let sceneView = SCNView(frame: self.view.frame)
        self.view.addSubview(sceneView)
        
        let scene = SCNScene()
        sceneView.scene = scene
        
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 10, z: 15)
        scene.rootNode.addChildNode(cameraNode)
        
        // Свет
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light?.type = .omni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)
        
        // Плоскость
        let floor = SCNFloor()
        let floorNode = SCNNode(geometry: floor)
        scene.rootNode.addChildNode(floorNode)
        
        // Физические свойства плоскости
        floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil)
        
        // Мяч
        let sphereGeometry = SCNSphere(radius: 1.0)
        let sphereNode = SCNNode(geometry: sphereGeometry)
        sphereNode.position = SCNVector3(x: 0, y: 10, z: 0)
        scene.rootNode.addChildNode(sphereNode)
        
        // Физические свойства мяча
        sphereNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
        sphereNode.physicsBody?.mass = 2.0
        
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.backgroundColor = UIColor.black
    }
}

Заключение

SceneKit — это мощный инструмент для создания интерактивных 3D-приложений и игр на платформе iOS. Он интуитивно прост в использовании, но в то же время предоставляет достаточно возможностей для создания сложных графических эффектов и анимаций.