Reputation: 16446
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
Upvotes: 1
Views: 348
Reputation: 16446
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;
}
}
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
}
Upvotes: 2