Why does this entity appear behind spatial tap collision location?

I am trying to make a world anchor where a user taps a detected plane.

How am I trying this?

First, I add an entity to a RealityView like so:

 let anchor = AnchorEntity(.plane(.vertical, classification: .wall, minimumBounds: [2.0, 2.0]), trackingMode: .continuous)
anchor.transform.rotation *= simd_quatf(angle: -.pi / 2, axis: SIMD3<Float>(1, 0, 0))

let interactionEntity = Entity()
interactionEntity.name = "PLANE"

let collisionComponent = CollisionComponent(shapes: [ShapeResource.generateBox(width: 2.0, height: 2.0, depth: 0.02)])
interactionEntity.components.set(collisionComponent)
interactionEntity.components.set(InputTargetComponent())

anchor.addChild(interactionEntity)
content.add(anchor)

This:

  1. Declares an anchor that requires a wall 2 meters by 2 meters to appear in the scene with continuous tracking
  2. Makes an empty entity and gives it a 2m by 2m by 2cm collision box
  3. Attaches the collision entity to the anchor
  4. Finally then adds the anchor to the scene

It appears in the scene like this:

Great! Appears to sit right on the wall.

I then add a tap gesture recognizer like this:

SpatialTapGesture()
   .targetedToAnyEntity()
   .onEnded { value in
      guard value.entity.name == "PLANE" else { return }
      var worldPosition: SIMD3<Float> = value.convert(value.location3D, from: .local, to: .scene)
      let pose = Pose3D(position: worldPosition, rotation: value.entity.transform.rotation)
      let worldAnchor = WorldAnchor(transform: simd_float4x4(pose))
      let model = ModelEntity(mesh: .generateBox(size: 0.1, cornerRadius: 0.03), materials: [SimpleMaterial(color: .blue, isMetallic: true)])
      model.transform = Transform(matrix: worldAnchor.transform)
      realityViewContent?.add(model)

I ASSUME This:

  1. Makes a world position from the where the tap connects with the collision entity.
  2. Integrates the position and the collision plane's rotation to create a Pose3D.
  3. Makes a world anchor from that pose (So it can be persisted in a world tracking provider)
  4. Then I make a basic cube entity and give it that transform.

Weird Stuff: It doesn't appear on the plane.. it appears behind it...

Why, What have I done wrong?

The X and Y of the tap location appears spot on, but something is "off" about the z position.

Also, is there a recommended way to debug this with the available tools?

I'm guessing I'll have to file a DTS about this because feedback on the forum has been pretty low since labs started.

Accepted Reply

This works in beta 3

Replies

If you file a DTS, please reply back with your solution. Thanks

  • Still working with them. It turns out entities that are not descendants of a world targeting Anchor entity will not return accurate position3D information in the spatial tap gesture handler.

    If we want that capability we should file a feedback.

Add a Comment

This works in beta 3