Невозможно нарисовать boundBox при обнаружении объекта с помощью arkit2 - PullRequest
1 голос
/ 15 июня 2019

Я занимаюсь разработкой приложения для iOS, которое будет выделять объекты (не те, которые мы делаем с файлами .arobject) с выделенными рамками в реальном мире.Идея состоит в том, чтобы реализовать только отрисовку boundBox из этой документации / примера.

Получил некоторую идею из этого ответа stackoverflow, но все еще не может нарисовать контурный boundBox для сканируемого объекта.

// Declaration
let configuration = ARObjectScanningConfiguration()
let augmentedRealitySession = ARSession()

// viewWillAppear(_ animated: Bool)
configuration.planeDetection = .horizontal
sceneView.session.run(configuration, options: .resetTracking)

// renderer
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        //print("\(self.detectionObjects.debugDescription)")
        guard let objectAnchor = anchor as? ARObjectAnchor else { return }

        //2. Create A Bounding Box Around Our Object
        let scale = CGFloat(objectAnchor.referenceObject.scale.x)
        let boundingBoxNode = BlackMirrorzBoundingBox(points: objectAnchor.referenceObject.rawFeaturePoints.points, scale: scale)
        node.addChildNode(boundingBoxNode)

    }

// BlackMirrorzBoundingBox class

init(points: [float3], scale: CGFloat, color: UIColor = .cyan) {
        super.init()

        var localMin = float3(repeating: Float.greatestFiniteMagnitude)
        var localMax = float3(repeating: -Float.greatestFiniteMagnitude)

        for point in points {
            localMin = min(localMin, point)
            localMax = max(localMax, point)
        }

        self.simdPosition += (localMax + localMin) / 2
        let extent = localMax - localMin

        let wireFrame = SCNNode()
        let box = SCNBox(width: CGFloat(extent.x), height: CGFloat(extent.y), length: CGFloat(extent.z), chamferRadius: 0)
        box.firstMaterial?.diffuse.contents = color
        box.firstMaterial?.isDoubleSided = true
        wireFrame.geometry = box
        setupShaderOnGeometry(box)
        self.addChildNode(wireFrame)
    }

func setupShaderOnGeometry(_ geometry: SCNBox) {
        guard let path = Bundle.main.path(forResource: "wireframe_shader", ofType: "metal", inDirectory: "art.scnassets"),
            let shader = try? String(contentsOfFile: path, encoding: .utf8) else {

                return
        }

        geometry.firstMaterial?.shaderModifiers = [.surface: shader]
    }

Используя вышеупомянутую логику, я получаю прямоугольник только на плоской поверхности вместо выделенного прямоугольника, как на этом рисунке.

...