【问题标题】:Sceneview Translate /move Point of view camera with gestureSceneview 翻译/移动带有手势的视角相机
【发布时间】:2021-05-31 21:18:43
【问题描述】:

所以我需要在 Mac 催化剂应用程序中使用平移手势移动场景视图的视点。 iPhone 和 iPad 有默认的两指拖动。

我试过了

    let point = gesture.location(in: self)
    let v1 = self.projectPoint(SCNVector3Zero)
    let vector = self.unprojectPoint(SCNVector3Make(Float(point.x), Float(point.y), v1.z))
    self.pointOfView?.position = SCNVector3(vector.x, vector.y, self.pointOfView!.position.z)

如果我将它应用于 SceneKit 根节点,它正在工作,但我只需要移动视点而不是根节点的位置

请推荐

【问题讨论】:

    标签: ios camera scenekit mac-catalyst


    【解决方案1】:

    谁还没有得到它

    解决办法

    var previousLocation = SCNVector3(x: 0, y: 0, z: 0)
    @objc func panned(gesture:UIPanGestureRecognizer) {
        
        
        let view = self.sceneView1!
        let translation = gesture.translation(in: view)
    
        let location = gesture.location(in: view)
        let secLocation = CGPoint(x: location.x + translation.x, y: location.y + translation.y)
    
        let P1 = view.unprojectPoint(SCNVector3(x: Float(location.x), y: Float(location.y), z: 0.0))
        let P2 = view.unprojectPoint(SCNVector3(x: Float(location.x), y: Float(location.y), z: 1.0))
    
           let Q1 = view.unprojectPoint(SCNVector3(x: Float(secLocation.x), y: Float(secLocation.y), z: 0.0))
           let Q2 = view.unprojectPoint(SCNVector3(x: Float(secLocation.x), y: Float(secLocation.y), z: 1.0))
    
           let t1 = -P1.z / (P2.z - P1.z)
           let t2 = -Q1.z / (Q2.z - Q1.z)
    
           let x1 = P1.x + t1 * (P2.x - P1.x)
           let y1 = P1.y + t1 * (P2.y - P1.y)
    
           let P0 = SCNVector3Make(x1, y1,0)
    
           let x2 = Q1.x + t2 * (Q2.x - Q1.x)
           let y2 = Q1.y + t2 * (Q2.y - Q1.y)
    
           let Q0 = SCNVector3Make(x2, y2, 0)
    
           var diffR = Q0 - P0
        
        diffR = SCNVector3Make(diffR.x * -1, diffR.y * -1, diffR.z * -1)
       //    diffR *= -1
    
        let cameraNode = view.pointOfView
    
           switch gesture.state {
           case .began:
               previousLocation = cameraNode!.position
               break;
           case .changed:
            cameraNode?.position = SCNVector3Make(previousLocation.x + diffR.x, previousLocation.y + diffR.y, previousLocation.z + diffR.z)
               break;
           default:
               break;
           }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多