RealityKit - отображение файла .reality с помощью SwiftUI - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь отобразить файл реальности с помощью ARView, но когда модель открывается, она очень мала, и жесты не работают. Может кто-нибудь указать мне, что я делаю не так? Файл реальности должен отображаться без использования камеры телефона.

struct AugmentedRealityView: UIViewRepresentable {

var name: String
var url: URL

func makeUIView(context: Context) -> ARView {
    let arView = ARView(frame: .zero)
    arView.cameraMode = .nonAR
    
    load(url: url, name: name) {
        result in
        
        switch result {
        case .success(let model):
            let anchor = AnchorEntity()
            arView.scene.addAnchor(anchor)
            
            let parentEntity = ModelEntity()
            parentEntity.addChild(model)

            // Handle the gestures for rotation and scale
            let entityBounds = model.visualBounds(relativeTo: parentEntity)
            parentEntity.collision = CollisionComponent(shapes: [ShapeResource.generateBox(size: entityBounds.extents).offsetBy(translation: entityBounds.center)])
            arView.installGestures(.all, for: parentEntity)
            anchor.addChild(parentEntity)
            
        case .failure(let error):
            print("\nError: \(error)")
        }
    }

    return arView
}

func updateUIView(_ uiView: ARView, context: Context) { }

private func load(url: URL, name: String, completionHandler: @escaping (Result<Entity, Error>) -> ()) {
    var cancellable: AnyCancellable? = nil
    
    cancellable = ModelEntity.loadAsync(contentsOf: url, withName: name)
        .sink(
            receiveCompletion: { loadCompletion in
                
                if case let .failure(error) = loadCompletion {
                    completionHandler(.failure(error))
                }
                cancellable?.cancel()
            },
            receiveValue: { model in
                
                completionHandler(.success(model))
            })
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

Используйте следующий код, чтобы установить соответствующий масштаб для вашей модели:

let anchor = AnchorEntity()

anchor.addChild(model)
anchor.scale = [50, 50, 50]   
arView.scene.anchors.append(anchor)

Если вы хотите увидеть, как этот код может выглядеть и где его место в receiveValue блоке loadModelAsync() метод, посмотрите этот пост .

...