Machineboy空

RealityKit 입문 - ARCouchingView 더하기 본문

언어/swift

RealityKit 입문 - ARCouchingView 더하기

안녕도라 2024. 10. 14. 11:04

https://developer.apple.com/documentation/arkit/arcoachingoverlayview

 

ARCoachingOverlayView | Apple Developer Documentation

A view that displays standardized onboarding instructions to direct users toward a specific goal.

developer.apple.com

import SwiftUI
import RealityKit
import ARKit

struct ContentView : View {
    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}


struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
            let anchor = AnchorEntity(plane: .horizontal)
            anchor.name = "Plane Anchor"
            arView.scene.addAnchor(anchor)
            arView.addCoaching()
            
            let config = ARWorldTrackingConfiguration()
            config.planeDetection = [.horizontal] // 수평 평면 탐지 활성화
            arView.session.run(config)
            
            return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}
    
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

extension ARView: ARCoachingOverlayViewDelegate {
    
    func addCoaching() {
        
        let coachingOverlay = ARCoachingOverlayView()
        
        coachingOverlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        coachingOverlay.goal = .horizontalPlane
        coachingOverlay.session = self.session
        //oachingOverlay.delegate = self
        self.addSubview(coachingOverlay)
    }
    
    private func addVirtualObjects() {
        
        let box = ModelEntity(mesh: MeshResource.generateBox(size: 0.3), materials: [SimpleMaterial(color: .green, isMetallic: true)])
        
        guard let anchor = self.scene.anchors.first(where: { $0.name == "Plane Anchor" }) else {
            return
        }
        
        anchor.addChild(box)
        
    }
    
    public func coachingOverlayViewDidDeactivate(_ coachingOverlayView: ARCoachingOverlayView) {
        addVirtualObjects()
    }
    
}

 

CouchingView라는 게 환경이 명확히 인지되지 않을 때 뜨는 안내화면인듯하다.

iphone12로 테스트할 땐 코칭뷰가 자주뜨는데, iphone 15로 테스트하면 정말 근접으로 초점을 잃을 수준이 아니고서야 코칭뷰가 거의 뜨지 않음! 기기 성능이 이렇게 차이가난다