swiftuiscenekithittestscnscenerenderer

SCNSceneRenderer hitTest does not hit a visible node


I am developing an iOS app with SwiftUI and SceneKit. My scene has only 2 visible nodes. I want to tap the node that is in front of the other, and get the tap position. I thus implemented the following View:

SceneKitView(viewModel: viewModel)
    .gesture(
        SpatialTapGesture(count: 1)
            .onEnded() { event in
                guard let renderer = viewModel.lastRenderer else { return }
                let hits = renderer.hitTest(event.location, options: nil)
                print("Nr hits: \(hits.count)")
            }
    )

When I set a breakpoint at the print statement and tap the visible node on the screen, renderer is defined, and it has the correct scene (verified by lldb). Moreover, event.location is a valid point in the middle of the screen.
But nr of hits is always 0.
I don't understand why hitTest does not hit the tapped object, since I don't have any category mask set.
Any help is welcome!


Solution

  • Problem solved, although I don't understand why:
    I used a SCNCamera with

    camera.zNear = 0.001
    camera.zFar = 40000
    

    With this setting, the node to be hit was visually displayed, i.e. the setting was correct, but hitTest did not hit the node.

    When I replaced both lines by

    camera.automaticallyAdjustsZRange = true
    

    nothing changed visually, but hitTest finds the node.