Как обнаружить касание на SKShapeNode в видео сфере? - PullRequest
0 голосов
/ 10 апреля 2019

Я использую этот простой код для воспроизведения 360 видео.Мне нужно добавить точку к видео - с этим проблем нет.Но как отследить клики по нему?В этом примере добавление точки происходит в методе viewDidLoad.Я пытался прикоснуться Bean, но этот метод не работает.Я очень надеюсь на вашу помощь

class ViewControllerTwo: UIViewController {

    let motionManager = CMMotionManager()
    let cameraNode = SCNNode()
    var sphereNode: SCNNode!

    @IBOutlet weak var sceneView: SCNView!

    func createSphereNode(material: AnyObject?) -> SCNNode {
        let sphere = SCNSphere(radius: 100.0)
        sphere.segmentCount = 96
        sphere.firstMaterial!.isDoubleSided = true
        sphere.firstMaterial!.diffuse.contents = material
        let sphereNode = SCNNode(geometry: sphere)
        sphereNode.position = SCNVector3Make(0,0,0)
        return sphereNode
    }

    func configureScene(node sphereNode: SCNNode) {
        let scene = SCNScene()
        sceneView.scene = scene
        sceneView.showsStatistics = true
        sceneView.allowsCameraControl = true

        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3Make(0, 0, 0)
        scene.rootNode.addChildNode(sphereNode)
        scene.rootNode.addChildNode(cameraNode)
    }


    func startCameraTracking() {
        motionManager.deviceMotionUpdateInterval = 1.0 / 60.0
        motionManager.startDeviceMotionUpdates(to: .main) { [weak self] (data, error) in
            guard let data = data else { return }

            let attitude: CMAttitude = data.attitude
            self?.cameraNode.eulerAngles = SCNVector3Make(Float(attitude.roll + Double.pi/2.0), -Float(attitude.yaw), -Float(attitude.pitch))
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(fileURLWithPath: Bundle.main.path(forResource: "google-help-vr", ofType: "mp4")!)

        let player = AVPlayer(url: url )
        let videoNode = SKVideoNode(avPlayer: player)
        let size = CGSize(width: 1025, height: 512)
        videoNode.size = size
        videoNode.position = CGPoint(x: size.width / 2, y: size.height / 2)
        let spriteScene = SKScene(size: size)
        spriteScene.addChild(videoNode)

        // How to detect when tapped?
        let circ = SKShapeNode(rectOf: CGSize(width: 50, height: 50), cornerRadius: 25)
        circ.fillColor = .red
        circ.isUserInteractionEnabled = true
        videoNode.addChild(circ)

        sphereNode = createSphereNode(material:spriteScene)

        configureScene(node: sphereNode)
        guard motionManager.isDeviceMotionAvailable else {
            return
        }
        startCameraTracking()
        player.play()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        sceneView.play(self)
    }
}

Я сделал собственный класс для объекта SKShapeNode, чтобы отслеживать клики через метод touchesBegan.Но все безуспешно

1 Ответ

1 голос
/ 10 апреля 2019

Вы можете использовать распознаватель UITapGesture для получения 2D-точки, затем используйте SCNSceneRenderer .hitTest (_: options:) , чтобы получить все возможные пересечения вдоль этого луча. Обратите внимание, что этот метод используется в протоколе SCNSceneRenderer, которому соответствует SCNView, поэтому вы могли пропустить его в документации по SCNView.

    @IBAction func tap(_ recognizer: UITapGestureRecognizer) {
        let location = recognizer.location(in: sceneView)
        if let firstResult = sceneView.hitTest(location, options: nil).first,
            //Do stuff with firstResult here
        }
...