Обновлено: 20 июня 2021 г.
TL;DR
RealityKit 2.0
![введите описание изображения здесь](https://i.stack.imgur.com/qn4aq.jpg)
RealityKit - это самый молодой SDK в семействе технологий рендеринга Apple. Этот высокоуровневый фреймворк был выпущен в 2019 году. RealityKit создан для проектов AR / VR, имеет упрощенные настройки для многопользовательского взаимодействия и может использоваться в iOS / macOS. Выполняет многопоточную визуализацию.
У нас нет Objective-C, RealityKit поддерживает только Swift и довольно декларативный синтаксис (как в SwiftUI). Основное преимущество RealityKit - он может дополнять / изменять / настраивать сцены, поступающие из приложения Reality Composer, и может быть мощным расширением для ARKit - хотя он также выделяется как отдельный AR SDK. В RealityKit основными единицами измерения являются сущности (ModelEntity, AnchorEntity, TriggerVolume, BodyTrackedEntity , PointLight, SpotLight, DirectionalLight и PerspectiveCamera), который имеет компоненты и может быть создано из ресурсов, таких как ModelEntity. На платформе работает Entity Component System (ECS) на ЦП для управления такими задачами, как физика, анимация, обработка звука и сетевая синхронизация. Но он полагается на оборудование Metal и GPU для выполнения многопоточного рендеринга. В RealityKit есть шесть материалов: UnlitMaterial
, SimpleMaterial
, PhysicallyBasedMaterial
(с 18 полями обзора для управления внешним видом материала), OcclusionMaterial
, VideoMaterial
и, конечно же, CustomMaterial
.
Обратите особое внимание на тени на iOS - устройства до чипсета A11 создают проекционные тени (также известные как карта глубины), но на устройствах с A12 и выше мы можем видеть тени с трассировкой лучей. Многие современные функции рендеринга в RealityKit по умолчанию On
: глубина резкости камеры, окклюзия лица / человека, заземляющие тени, размытие при движении, зернистость камеры и т. Д.
Образец кода:
@IBOutlet weak var arView: ARView!
let box = MeshResource.generateBox(size: 0.5)
let material = PhysicallyBasedMaterial()
let model = ModelEntity(mesh: box, materials: [material])
let anchor = AnchorEntity(world: [0, 0,-1])
anchor.addChild(model)
arView.scene.anchors.append(anchor)
RealityKit читает файлы в форматах .usdz
, .rcproject
и .reality
. Поддерживает анимацию ресурсов, динамику, материалы PBR, освещение на основе изображений HDR и пространственный звук. Все модели сцены должны быть привязаны к якорям (класс AnchorEntity). Framework автоматически генерирует и использует mipmaps, которые представляют собой серию вариантов текстуры объектов с постепенным уменьшением разрешения. которые улучшают время рендеринга при применении к удаленным объектам. RealityKit работает с многоугольной сеткой, созданной с помощью Реконструкция сцены функция. Я хочу добавить несколько слов о AR Quick Look
- фреймворке с нулевыми настройками, который построен на движке RealityKit и предназначен для быстрой визуализации AR.
Заключение. RealityKit предоставляет вам высококачественную технологию рендеринга и современные возможности дополненной реальности прямо из коробки. Поддерживает сканер LiDAR. Поддерживает Photogrammetry
инструментов. Воспроизводит поведение Reality Composer через API уведомлений. RealityKit можно использовать как автономный фреймворк или как партнер ARKit и MetalKit. Начиная с iOS 15, у нас есть доступ к fragment/pixel shaders
и geometry modifiers
через скрипты Metal и CustomMaterials.
RealityKit работает с раскадровками UIKit или с интерфейсами SwiftUI. Он имеет как минимум шаблонный код. Например, RealityKit имеет очень простую настройку для столкновения моделей и для жестов (панорамирование, поворот, сжатие). И есть композиция, а не наследование, так что это скорее структура программирования, ориентированного на протокол - tight coupling
в большинстве случаев больше не является проблемой в вашем коде. RealityKit идеально подходит для реактивной парадигмы Combine, которая помогает обрабатывать издателей, подписчиков и асинхронные события.
Собственный вид RealityKit - ARView.
@available(OSX 10.15, iOS 13.0, *)
@objc open class ARView : ARViewBase
SceneKit
![введите описание изображения здесь](https://i.stack.imgur.com/yslrH.jpg)
SceneKit также является фреймворком высокого уровня. Самый старый в семействе технологий рендеринга Apple. Он был выпущен в 2012 году. SceneKit был разработан для виртуальной реальности и может работать на iOS / macOS. Для проектов AR вы можете использовать его только вместе с ARKit. SceneKit поддерживает как Objective-C, так и Swift. В SceneKit основным блоком является узел (класс SCNNode), который имеет свою собственную иерархию и может хранить источник света (SCNLight) или < strong> camera (SCNCamera), или геометрию (SCNGeometry), или систему частиц (SCNParticleSystem), или аудиоплееры (SCNAudioPlayer). Основное преимущество SceneKit - он легко настраивается, он может изменять геометрию и материалы во время выполнения, имеет морферы, скинов и ограничений, он отображает сцену со скоростью до 120 кадров в секунду и имеет расширенная настройка для системы частиц. Существуют шейдеры Blinn
, Constant
, Lambert
, Phong
, ShadowOnly
и PBR
.
Occlusion
шейдер также доступен для нас в SceneKit, но в настраиваемой форме (здесь нет готового материала для окклюзии, который мы можем найти в RealityKit). Если вам нужен видеоматериал в SCNScene, вы должны реализовать SpriteKit SKVideoNode
.
Также мы можем использовать SCNProgram object
для выполнения пользовательского рендеринга. Это полная программа шейдера Metal или OpenGL, которая заменяет рендеринг материала или даже геометрии в SceneKit. Надежным помощником SceneKit является библиотека ввода-вывода модели, которая выполняет импорт, экспорт и манипулирование моделями. с использованием общей инфраструктуры.
Образец кода:
@IBOutlet weak var sceneView: SCNView!
sceneView.scene = SCNScene()
sceneView.autoenablesDefaultLighting = true
let boxNode = SCNNode()
boxNode.geometry = SCNBox(width: 0.5, height: 0.5, length: 0.5, chamferRadius: 0)
boxNode.geometry?.firstMaterial?.lightingModel = .physicallyBased
boxNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red
boxNode.geometry?.firstMaterial?.metalness.contents = 1.0
sceneView.scene?.rootNode.addChildNode(boxNode)
SceneKit читает файлы в форматах .usdz
, .dae
и .scn
. Поддерживает вложенную анимацию ресурсов, динамику, частицы, материалы PBR, HDR IBL и пространственный звук. Для неявной и явной анимации преобразования любого узла вы можете использовать SCNAction, SCNTransaction и классы CAAnimation. Хотя настройка столкновений в SceneKit немного сложна. Чтобы создать модульную и масштабируемую игровую архитектуру с помощью SceneKit, нам необходимо реализовать < strong> entity-component шаблон.
Заключение: SceneKit предоставляет вам высококачественную технологию рендеринга (но сначала вам нужно настроить physicallyBased
шейдер), хотя для проектов AR вы можете использовать его только с ARKit. SceneKit обладает широкими возможностями настройки и может использоваться с Swift и Objective-C, а также предоставляет вам набор полезных renderer(...)
методов экземпляра, поступающих из Протокол ARSCNViewDelegate, который позволяет обновлять модели AR и отслеживаемые якоря со скоростью 60 кадров в секунду. Работает с UIKit и SwiftUI (несмотря на то, что в Xcode нет шаблона SceneKit+SwiftUI
). Есть очевидные причины, по которым Apple может отказаться от этой платформы в течение следующих 3 лет - SceneKit не обновлялся с 2017 года (за исключением незначительных изменений, таких как clearCoat свойство материала). Но в SceneKit все еще есть несколько основных преимуществ по сравнению с RealityKit 2.0.
Родной вид SceneKit - SCNView.
@available(iOS 8.0, tvOS 9.0, *)
open class SCNView : UIView, SCNSceneRenderer, SCNTechniqueSupport
@available(OSX 10.8, *)
open class SCNView : NSView, SCNSceneRenderer, SCNTechniqueSupport
Металл и MetalKit
![введите описание изображения здесь](https://i.stack.imgur.com/zuu1W.jpg)
Если быть точным, Metal - это не технология рендеринга, а ускоритель графического процессора. Выпущен в 2014 году. Это низкоуровневый фреймворк. Metal реализован повсюду - в RealityKit, SceneKit, ARKit, CoreML, Vision, AVFoundation и т. Д. Metal объединяет функции, аналогичные OpenGL и OpenCL, под капотом всего одного API. Конечно, Metal можно использовать в качестве средства рендеринга для продвинутой 3D-графики.
Согласно документации Apple: Metal - это язык программирования на основе C ++, который разработчики могут использовать для написания кода, который выполняется на графическом процессоре для графики и универсальных параллельных вычислений с данными. Поскольку Metal основан на C ++, разработчики найдут его знакомым и простым в использовании. С помощью Metal как графические, так и вычислительные программы могут быть написаны на едином унифицированном языке, что обеспечивает более тесную интеграцию между ними.
В дополнение к Metal вы можете использовать модуль MetalKit
(выпущен в 2015 году), который помогает создавать приложения Metal быстрее и проще, используя гораздо меньше кода. Он отображает графику в стандартном металлическом представлении, загружает текстуры из многих источников и эффективно работает с моделями, предоставленными фреймворком Model I / O.
Металл начинает сиять, когда вы визуализируете значительно большее количество полигонов или 3D-частиц, чем SceneKit способен визуализировать.
Образец кода:
import MetalKit
class RedCube: Primitive {
override func buildVertices() {
vertices = [ Vertex(position: float3(-1,1,1), color: float4(1,0,0,1)),
Vertex(position: float3(-1,-1,1), color: float4(1,0,0,1)),
Vertex(position: float3(1,1,1), color: float4(1,0,0,1)),
Vertex(position: float3(1,-1,1), color: float4(1,0,0,1)),
Vertex(position: float3(-1,1,-1), color: float4(1,0,0,1)),
Vertex(position: float3(1,1,-1), color: float4(1,0,0,1)),
Vertex(position: float3(-1,-1,-1), color: float4(1,0,0,1)),
Vertex(position: float3(1,-1,-1), color: float4(1,0,0,1)) ]
indices = [ 0,1,2, 2,1,3, 5,2,3, 5,3,7, 0,2,4, 2,5,4,
0,1,4, 4,1,6, 5,4,6, 5,6,7, 3,1,6, 3,6,7 ]
}
}
...
class CubeScene: Scene {
override init(device: MTLDevice) {
super.init(device: device)
let redCube = RedCube(withDevice: device)
objects.append(redCube)
redCube.translate(direction: float3(0,0,-10))
add(child: redCube)
}
override func render(commandEncoder: MTLRenderCommandEncoder,
deltaTime: Float) {
objects.forEach { $0.rotate(angle: deltaTime,
axis: float3(1, 1,-1)) }
super.render(commandEncoder: commandEncoder,
deltaTime: deltaTime)
}
}
Заключение: разработчики обычно используют Metal framework для создания высококачественной визуализации графического процессора для игр со сложной трехмерной средой, для приложений обработки видео, таких как Final Cut Pro и Nuke, для трехмерных приложений, таких как Maya, или для больших данных. научные приложения, которые должны работать для научных исследований. Учтите, что трассировка лучей в Metal выполняется намного быстрее, чем в RealityKit.
Родной вид MetalKit - MTKView.
@available(iOS 9.0, tvOS 9.0, *)
open class MTKView : UIView, NSCoding, CALayerDelegate
@available(OSX 10.11, *)
open class MTKView : NSView, NSCoding, CALayerDelegate
SpriteKit
![введите описание изображения здесь](https://i.stack.imgur.com/Gx5az.jpg)
SpriteKit - это фреймворк Apple на основе узлов для создания и рендеринга 2D-игр и 2D-графики. Был выпущен в 2013 году. Вы можете использовать SpriteKit как отдельный API или использовать его с SceneKit и ARKit. Его главная особенность - возможность рисовать спрайты с физикой, 2D-текстом и формами, изображениями и видео. В SpriteKit вы можете писать код на Objective-C или Swift.
Официальная документация: SpriteKit - это универсальная 2D-среда, в которой используется Metal для достижения высокопроизводительного рендеринга, а также простой интерфейс программирования, упрощающий создание игр и других приложений с интенсивным использованием графики. . Используя богатый набор анимаций и физических моделей поведения, вы можете быстро оживить свои визуальные элементы и изящно переходить между экранами.
SpriteKit работает с двумя собственными типами представления, которые наследуются от UIView и NSView:
@available(iOS 7.0, tvOS 9.0, *)
open class SKView : UIView
@available(OSX 10.9, *)
open class SKView : NSView
ARKit 5.0
![введите описание изображения здесь](https://i.stack.imgur.com/CNkbR.jpg)
В ARKit нет никакого механизма рендеринга. Этот модуль отвечает только за высокое качество World Tracking
и Scene Understanding
(обнаружение плоскости, распределение лучей, реконструкция сцены и оценка освещенности). Однако ARKit может обрабатывать данные Canonical Facial Meshes
(ARFaceGeometry класс) или Vertices, Normals, Triangular Faces, and Classifications
реконструированной геометрии (ARMeshGeometry класс).
Вот четыре типа представлений, с которыми может работать ARKit: ARSCNView, ARSKView, ARView и MTKView.
@available(iOS 11.0, *)
open class ARSCNView : SCNView, ARSessionProviding
@available(iOS 11.0, *)
open class ARSKView : SKView, ARSessionProviding
@available(iOS 13.0, *)
@objc open class ARView : ARViewBase
@available(iOS 9.0, *)
open class MTKView : UIView, NSCoding, CALayerDelegate
Если вам нужна дополнительная информация об ARKit и его возможностях, прочтите ЭТО ЗАПИСЬ.
person
Andy Fedoroff
schedule
03.03.2020