0

I have a 3D model with .scn extension. How to zoom it with pinch gesture without virtualobject file from iOS sample Placing Objects application.

Pinch gesture works well with .scn's if its converted from .obj file. But its not working with .dae model.

    func addPinchGestureToSceneView() {

        pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale))
        pinchGesture.scale = 1.0;
        pinchGesture.delegate = self
        self.sceneView.addGestureRecognizer(pinchGesture)
    }
  private func node(at position: CGPoint) -> SCNNode? {
        var hitTestOptions = [SCNHitTestOption: Any]()
        hitTestOptions[SCNHitTestOption.boundingBoxOnly] = true
        return sceneView.hitTest(position, options: hitTestOptions)
            .first(where: { self.getOnlyModelName(name: $0.node.name ?? "") == self.currentmodel.modelname})?
            .node

    }

 @objc func scale(_ gesture: UIPinchGestureRecognizer) {

        if self.currentmodel.isZoomEnabled == false{
            return
        }

        let location = gesture.location(in: sceneView)

        guard let node = node(at: location)else{return}

    //    guard let node = node(at: location) else  { return }

        switch gesture.state {
        case .began:
            originalScale = node.scale
            gesture.scale = CGFloat(node.scale.x)
            print("Begin:: \(originalScale)")
        case .changed:
            guard var originalScale = originalScale else { return }
            if gesture.scale > 2.0{
                return
            }
            originalScale.x = Float(gesture.scale)
            originalScale.y = Float(gesture.scale)
            originalScale.z = Float(gesture.scale)
            node.scale = originalScale
        case .ended:

            guard var originalScale = originalScale else { return }
            if gesture.scale > 2.0{
                return
            }
            originalScale.x = Float(gesture.scale)
            originalScale.y = Float(gesture.scale)
            originalScale.z = Float(gesture.scale)
            node.scale = originalScale
            gesture.scale = CGFloat(node.scale.x)

        default:
            gesture.scale = 1.0
            originalScale = nil
        }

1 Answers1

0

When it's a dae, you might need to try to grab the parent of the node caught in the hit test. I had a similar issue with dae that got solved by getting the parent of the child, or even sometimes the grandparent of the child.

Alan
  • 1,132
  • 7
  • 15