Разбираемся с 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. Он интуитивно прост в использовании, но в то же время предоставляет достаточно возможностей для создания сложных графических эффектов и анимаций.