我用这个简单的代码来播放360视频。我需要在视频中添加一点-这没有问题。但是如何追踪点击呢?在本例中,添加点发生在viewDidLoad方法中。
我试过触摸开始,但这个方法不起作用。我真的希望你能帮助我

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创建了一个self类,以便通过touchesbearth方法跟踪单击。但都没有成功

最佳答案

您可以使用uitapshite识别器来获取2D点,然后使用SCNSceneRenderer .hitTest(_:options:)来获取沿该光线的所有可能交点。注意,该方法基于scnsenerenderer协议,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
        }

关于ios - 如何在Video Sphere中检测SKShapeNode上的触摸?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55618346/

10-12 01:47