如何在Video Sphere中检测SKShapeNode上的触摸?

问题描述 投票:0回答:1

我使用这个简单的代码来播放360视频。我需要在视频中添加一个点 - 这没有问题。但是如何跟踪点击呢?在此示例中,在viewDidLoad方法中添加一个点。我尝试了touchesBegan,但这种方法不起作用。我真的希望得到你的帮助

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方法跟踪点击次数。但都没有成功

ios swift sprite-kit 360-degrees 360-virtual-reality
1个回答
1
投票

您可以使用UITapGesture识别器获取2D点,然后使用SCNSceneRenderer .hitTest(_:options:)获取沿该光线的所有可能的交叉点。请注意,该方法位于SCNSViewRenderer协议上,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
        }
© www.soinside.com 2019 - 2024. All rights reserved.