Home > Blockchain >  Create AnchorEntity in Swift with given plane and minimumBounds
Create AnchorEntity in Swift with given plane and minimumBounds

Time:05-18

let anchor = AnchorEntity(plane: .horizontal, minimumBounds: [0.2, 0.2])

This lane spits errors:

  • "Argument passed to call that takes no arguments"
  • "Cannot infer contextual base in reference to member 'horizontal'"

However on Apple website I see the option is correct:

init(plane: AnchoringComponent.Target.Alignment, classification: AnchoringComponent.Target.Classification, minimumBounds: SIMD2<Float>)

Why is that? It's a lane from a project I was trying to recreate, but it's about 2years old and abandoned. Has the syntax changed?

Below I paste a bigger chunk of code, maybe it will be useful:

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
// ========= THIS LANE CAUSES ERRORS =========
        let anchor = AnchorEntity(plane: .horizontal, minimumBounds: [0.2, 0.2])
// ========= THIS LANE CAUSES ERRORS =========

        arView.scene.addAnchor(anchor)
        
        var cards: [Entity] = []
        for _ in 1...16 {
            let box = MeshResource.generateBox(width: 0.04, height: 0.002, depth: 0.04)
            let metalMaterial = SimpleMaterial(color: .gray, isMetallic: true)
            let model = ModelEntity(mesh: box, materials: [metalMaterial])
            
            model.generateCollisionShapes(recursive: true)
            
            cards.append(model)
            
        }

CodePudding user response:

There's no error you've mentioned here. Everything works fine. Make sure you have the appropriate lighting conditions in the room and a suitable surface for tracking. If this error persists, move your code to a new Xcode 13.4 project.

Try my code:

import RealityKit
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    var tiles: [Entity] = []
    var anchor = AnchorEntity()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.anchor = AnchorEntity(plane: .horizontal, 
                           minimumBounds: [0.2, 0.2])
        arView.scene.addAnchor(anchor)
        
        for i in 1...16 {                
            let box = MeshResource.generateBox(width: 0.04,
                                              height: 0.002,
                                               depth: 0.04)                
            let model = ModelEntity(mesh: box)
            model.generateCollisionShapes(recursive: true)
            tiles.append(model)                
            self.anchor.addChild(tiles[i-1])
        }
        
        for (i, tile) in tiles.enumerated() {                
            let x = Float(i % 4) - 0.75
            let z = Float(i / 4) - 0.75             
            tile.position = [x * 0.05, 0, z * 0.05]
        }
    }
}

CodePudding user response:

Make sure you're targeting a physical or generic iOS device (ie. not the simulator or macOS).

The same constructors for a physical device don't exist in RealityKit for Simulator and macOS.

  • Related