RealityKit on 2D devices with new betas

Hi all,

I'm playing around with RealityKit to see if I can re-use the content for both iOS/macOS and visionOS with the new betas.

For the 2D devices, I'm looking at a more traditional, non AR setup. I've fallen over at the first hurdle; dragging an object around on a plane just as a test of how things all work.

I was trying to unproject from a plane to the view/window co-ordinates and move the box around based on the result.

The code below works if I angle the plane, weirdly; but not if the plane (as I understand it) is 'flat' on the ground.

Am I doing this the wrong way?

It behaves in a similar fashion with both the default PerspectiveCameraComponent and OrthographicCameraComponent.

import SwiftUI
import RealityKit

struct ContentView: View {
    var body: some View {
        RealityView { content in

            let cubemesh = MeshResource.generateBox(size: 0.2, cornerRadius: 0.05)
            let cubeModel = ModelEntity(mesh: cubemesh)
            cubeModel.generateCollisionShapes(recursive: false)
            cubeModel.components.set(InputTargetComponent())
            content.add(cubeModel)

            let cameraEntity = Entity()
            cameraEntity.components.set(OrthographicCameraComponent())
            //cameraEntity.components.set(PerspectiveCameraComponent())
            
            let cameraPosition: SIMD3<Float> = [10, 10, 5]
            let target: SIMD3<Float> = .zero
            cameraEntity.look(at: target, from: cameraPosition, relativeTo: nil)
            content.add(cameraEntity)
        }
        .gesture(DragGesture(coordinateSpace: .global)
            .targetedToAnyEntity()
            .onChanged() { value in
                
                let planeTransform = Transform(scale: SIMD3<Float>(1, 1, 1),
                                               rotation: simd_quatf(angle: 0, axis: SIMD3<Float>(0, 1, 0)),
                                               translation: SIMD3<Float>(0, 0, -1))
                
                print(planeTransform.matrix)
                
                #if !os(visionOS)
                if let placementPosition = value.unproject(value.location, from: .global, to: .scene, ontoPlane: (planeTransform.matrix))
                {
                    print("projected value:", placementPosition)
                    value.entity.position.x = placementPosition.x
                    value.entity.position.y = placementPosition.y
                    value.entity.position.z = 0
                }
                #endif
                
                print(value.location)
            })
               
    }
}

    #if os(visionOS)
#Preview("3D Device", windowStyle: .volumetric) {
    if #available(visionOS 2.0, *) {
        ContentView()
            .volumeBaseplateVisibility(.visible)
            .frame(depth: 1300)
            .frame(width: 1280)
            .frame(height: 1280)
        
    } else {
        ContentView()
        
    }
}
    #else
#Preview("2D Device") {
    
    ContentView()
        
}
#endif
RealityKit on 2D devices with new betas
 
 
Q