ioscamerascenekitmac-catalyst

Sceneview Translate /move Point of view camera with gesture


So I need to move Point of view of the sceneview with the pan gesture in Mac catalyst app. for iPhone and iPad there is default two finger drag.

I have tried with

    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)

if I apply this to SceneKit root node it is working , but I need to move point of view only not the position of the root node

Please suggest


Solution

  • Whoever still not get it

    here is the solution

    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;
           }
    
    }
    

    Better version Which works with Rotated camera

    let translation = gesture.translation(in: view)
         let screenCenter = CGPoint(x: view.bounds.width * 0.5, y: view.bounds.height * 0.5)
         
         // Convert the screen center to a 3D point in the scene
         let center3D = view.unprojectPoint(SCNVector3(Float(screenCenter.x), Float(screenCenter.y), 0.0))
         
         // Convert the translation vector from 2D screen coordinates to 3D scene coordinates
         let translation3D = view.unprojectPoint(SCNVector3(Float(screenCenter.x + translation.x), Float(screenCenter.y + translation.y), 0.0))
         
         // Calculate the difference between the translated and original 3D points
         let diff3D =  center3D - translation3D
         
         // Use diff3D to calculate the updated camera position
         let cameraNode = view.pointOfView
         switch gesture.state {
         case .began:
             previousLocation = cameraNode!.position
         case .changed:
             cameraNode?.position = SCNVector3Make(
                 previousLocation.x + diff3D.x,
                 previousLocation.y + diff3D.y,
                 previousLocation.z + diff3D.z
             )
         default:
             break
         }
    

    enter image description here