RealityKit로 증강현실 체험 구축

Augmented Reality (AR)는 가상 객체와 현실을 혼합하는 대화 형 경험을 만드는 물리적 세계에 디지털 콘텐츠를 오버레이합니다. Apple의 RealityKit 프레임 워크는 iOS용 AR 앱을 구축하기 위해 고도, 수행 API를 갖춘 개발자를 제공합니다. 이 문서는 기본, 설정, 엔티티티 구성 요소 아키텍처, 사용자 상호 작용, 애니메이션, 물리학, 협업 및 최적화를 포함합니다. 결국, Swift 및 RealityKit를 사용하여 연마 AR 경험을 만드는 방법을 실용적인 이해 할 수 있습니다.

시작: Project Setup 및 요구 사항

RealityKit를 가진 AR 앱을 개발하려면 Xcode 13 이상이 필요합니다. A9 칩 또는 새로운 (iPhone SE, 6s 및 나중에; iPads 5 gen 및 나중에) 및 Apple Developer 계정을 테스트합니다. iOS Simulator는 카메라 또는 센서 데이터를 지원하지 않습니다. 실제 ‐ 장치 테스트는 필수적입니다.

새로운 Xcode 프로젝트를 만들고 Augmented Reality App] 템플릿을 선택해 주세요. SwiftUI 또는 UIKit를 선택하여 선호도에 따라 – RealityKit는 모두 완벽하게 작동합니다. 템플릿은 과 기본 장면 설정이 제공됩니다.

또는, 당신은 수동으로 RealityKit을 기존 프로젝트에 추가 할 수 있습니다 프레임 워크를 가져 오기 :

import RealityKit
import ARKit

NSCameraUsageDescription]는 ]에서 설정되어 앱이 카메라 액세스를 필요로 하는 이유를 설명하는 사용자 친화적 인 문자열입니다.

자세한 내용은 Apple의 RealityKit 문서를 참조] 및 ARKit 문서]를 참조하세요.

Entity-Component System에 대한 이해

RealityKit은 Entity‐Component] 아키텍처를 사용하여 구성 장면을 생성하는 기본입니다. 은 구성품을 보유하고 있는 컨테이너입니다. 구성품은 행동, 외관, 물리 및 기타 속성을 정의합니다. 예를 들어, 는 3D 메쉬를 정의합니다. 는 위치/회로/스케줄을 처리하며, 는 시뮬레이션을 가능하게 합니다.

이 모듈 접근법은 복잡한 객체를 구성하기 쉽습니다. 당신은 엔티티티를 만들고 구성 요소를 첨부하고 계층 구조에 배치합니다. 장면의 뿌리는 (일반적으로 )이며, 이는 ARKit에 의해 감지 된 실제 ‐ 세계 위치로 가상 콘텐츠를 ties합니다.

앵커 및 추가 컨텐츠 만들기

가장 일반적인 앵커는 수평 또는 수직 표면에 콘텐츠를 첨부하는 평면 앵커입니다. 여기에는 인식 된 비행기에 3D 모델을 배치하는 방법 :

// Load a USDZ model
guard let model = try? ModelEntity.load(named: "robot") else { return }

// Create an anchor on any horizontal plane
let anchor = AnchorEntity(plane: .horizontal, classification: .any, minimumBounds: [0.2, 0.2])

// Attach the model to the anchor
anchor.addChild(model)

// Add the anchor to the ARView’s scene
arView.scene.addAnchor(anchor)

]을 사용하여 특정 세계 위치에서 앵커를 만들거나 ] 또는 를 사용하여 이미지 또는 얼굴을 감지하는 콘텐츠를 첨부 할 수 있습니다.

Building a Basic ar 장면 와 realitykit

간단한 모델 배치를 넘어 AR 뷰 라이프 사이클을 관리해야합니다. UIKit 앱에서 ]를 뷰 컨트롤러에 추가하십시오.

class ViewController: UIViewController {
 @IBOutlet var arView: ARView!

 override func viewDidLoad() {
 super.viewDidLoad()
 arView.session.delegate = self
 // Configure session
 let config = ARWorldTrackingConfiguration()
 config.planeDetection = [.horizontal, .vertical]
 arView.session.run(config)
 loadContent()
 }

 func loadContent() {
 // Create and add anchors
 }
}

SwiftUI의 경우 ]를 다리 ]를 SwiftUI 계층 구조로 나눕니다.

사용자 상호 작용: Gestures와 Hit ‐ 시험

AR 앱을 대화로 만들기 위해서는 사용자 탭, 드래그 및 회전을 처리해야 합니다. RealityKit는 사용자 터치를 식별하는 데 필요한 정보를 파악하기 위해 hit-testing을 제공합니다.

장소 또는 인터랙트로 탭

] ]에 추가하십시오. 제스처 핸들러에서 를 호출하여 손가락 아래 엔티티티를 검색하십시오.

arView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))))

@objc func handleTap(_ sender: UITapGestureRecognizer) {
 let location = sender.location(in: arView)
 if let entity = arView.entity(at: location) {
 // Scale the entity
 var transform = entity.transform
 transform.scale *= 1.2
 entity.move(to: transform, relativeTo: entity.parent, duration: 0.3, timingFunction: .easeInOut)
 } else {
 // Place a new object at the tapped location
 placeObject(at: location)
 }
}

func placeObject(at screenPoint: CGPoint) {
 let results = arView.raycast(from: screenPoint, allowing: .estimatedPlane, alignment: .any)
 guard let result = results.first else { return }
 let anchor = AnchorEntity(world: result.worldTransform)
 let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .blue, isMetallic: false)])
 anchor.addChild(box)
 arView.scene.addAnchor(anchor)
}

실제 표면에 대한 Raycasting은 당신이 비행기에 콘텐츠를 배치 할 때 엔티티티티가 더 신뢰할 수 있습니다. 이것을 위해 를 사용하십시오.

닥쳐와 Gestures로 회전

드래그를 활성화하려면 을 첨부하고 비행기를 따라 엔티티티의 위치를 업데이트하십시오. 회전을 위해 를 사용하십시오.

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
arView.addGestureRecognizer(panGesture)

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
 let location = sender.location(in: arView)
 guard let entity = arView.entity(at: location) else { return }
 guard let parent = entity.parent as? HasAnchoring else { return }
 // Translate the entity in the anchor’s local plane
 let translation = sender.translation(in: arView)
 // ... (convert to 3D movement)
}

견고한 구현을 위해 ] 를 사용하여 고려하십시오. RealityKit의 패키지 또는 ]] iOS 16 +의 제스처 속성.

고급 기능: 애니메이션, 물리학, 협업

의논하기

RealityKit는 skeletal Animations (USDZ 파일에서)과 속성 기반 애니메이션을 모두 지원합니다. 애니메이션 리소스를 가진 모델에 내장 된 애니메이션을 트리거하려면 :

guard let model = try? ModelEntity.load(named: "dancing_character") else { return }
model.playAnimation(model.availableAnimations[0].repeat(duration: .infinity), transitionDuration: 0.5, startsPaused: false)

또한 이전을 본 ] 방식을 사용하여 변형, 불투명, 또는 사용자 정의 매개 변수도 할 수 있습니다. 복잡한 순서에 대해서는 또는 를 사용하십시오.

물리학 시뮬레이션

중력, 충돌, 힘을 활성화하기 위해 를 첨부하십시오.

let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .red, isMetallic: false)])
box.position = [0, 0.5, 0] // above a plane

let physicsBody = PhysicsBodyComponent(
 massProperties: .default,
 material: .generate(staticFriction: 0.8, dynamicFriction: 0.5, restitution: 0.3),
 mode: .dynamic
)
box.components.set(physicsBody)

let collision = CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])
box.components.set(collision)
// Add box to anchor anchor.addChild(box)

상자는 비행기에 떨어지고 충돌에 응답합니다. 정체되는 물체 (벽과 같은)는 ]가 있어야 합니다.

협업 AR 세션

ARKit의 협업 세션을 통해 여러 기기는 동일한 AR 세계를 공유할 수 있습니다. 세션의 협업 옵션을 설정하여 협업을 활성화하십시오.

config.collaborationEnabled = true
arView.session.run(config)

]를 다른 피어에 네트워크 프레임 워크 (예를 들어, Multipeer Connectivity)를 통해 전송하십시오. 각 장치의 RealityKit 장면은 동기화됩니다. 이것은 멀티 플레이어 게임 또는 공유 디자인 리뷰에 이상적입니다.

Smooth AR Experience에 최적화된 성능

AR 앱은 높은 프레임 속도 (60 fps)를 요구하여 모션 병력을 피합니다. 이러한 관행을 따르십시오.

  • 낮은 ‐ 폴리 모델 및 최적화된 USDZ 파일. 낮은 을 유지하고 압축 된 질감 (KTX 또는 PNG)을 사용합니다.
  • ]일체의 수] 장면에서. ]를 디버그 카운트에 사용합니다.
  • Minimize draw call 를 사용하여 인스톨 - 여러 엔티티티를 통해 동일한 모델을 공유합니다.
  • Adjust 렌더링 품질 ]]] 이전 장치.
  • ]] 모델로드] 메인 스레드 차단을 방지하기 위해. 배경 큐에 모델을로드하고 준비 할 때 제시.
  • AR 세션 수명주기: ] 앱이 배경으로 갈 때, 전경에 구성을 다시 실행합니다.

자세한 안내는 Apple의 ]를 참조하여 Immersive AR Experience]를 입력하고 AR Experience를 문제 해결합니다.

Intuitive AR 인터페이스 설계

AR의 사용자 경험은 전통적인 앱과 다릅니다. 이러한 원칙을 따르십시오.

  • Surface detection feedback: 그리드 또는 윤곽을 가진 검출된 비행기를 시각화하여 사용자가 물건을 배치하는 것을 알고 있습니다.
  • Gestures는 Natural를 느낄 수 있어야 합니다.
  • Provide 시각적 힌트: Highlight Interactive entities 또는 유효한 비행기에서 사용자 포인트가 될 때 크로스헤드를 보여줍니다.
  • Handle lighting: RealityKit는 자동적으로 실제적으로 세계 빛을 견적하고 가상 객체에 적용할 수 있습니다. 를 사용하여 강도를 조정합니다.
  • ] 다양한 환경에서 테스트: 다른 조명, 질감, 방 크기 AR 추적에 영향을 미치는. 평균 조건을 최적화.

Debugging 및 테스트 AR 앱

Real‐device 테스트는 비 편도입니다. Xcode의 ]ARKit Debugging Features]를 사용하십시오:

  • Enable 기능 포인트, 세계 기원 및 물리학 와이어 프레임을 표시하는 것입니다.
  • ]를 사용하여 표면이 감지되면 로그를 볼 수 있습니다.
  • 를 추가하여 국가 및 오류를 추적합니다.
  • 여러 장치 세대에 테스트 (예 : iPhone 8 vs. iPhone 14 Pro)는 측정 성능에.

자동화된 UI 테스트를 위해 AR 데이터를 모을 수 있지만, 수동 테스트는 정확도에 필수적입니다.

관련 기사

RealKit는 AR 개발의 복잡성에 대해 요약하지만, 연마 된 경험을 구축하는 것은 엔티티티 아키텍처, 사용자 상호 작용, 성능 및 디자인에주의를 기울입니다. 덮여있는 기술을 결합함으로써 - 현장 설정 및 물리 및 협업에 대한 제스처 처리 - 사용자는 iOS 하드웨어의 전체 잠재력을 활용하고 사용자를 참여하는 AR 응용 프로그램을 만들 수 있습니다. Apple의 진화 AR 프레임 워크와 함께 현재를 유지하고 항상 실제 장치에 테스트하여 원활하고 몰입한 경험을 보장합니다.