iOS ARKitジェスチャードラッグ、回転、スケール3 Dモデル

2194 ワード

Arジェスチャー
公式ARKitドキュメントのサンプルコードに基づく
Swift 4.2コアジェスチャーコードは以下の通りです.
    override public func viewDidLoad() {
        super.viewDidLoad()
        
        sceneView.addGestureRecognizer(UIPinchGestureRecognizer.init(target: self, action: #selector(pinchDo)))//  
        sceneView.addGestureRecognizer(UIPanGestureRecognizer.init(target: self, action: #selector(panGuestDo)))
        sceneView.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: #selector(tapGuestDo)))
    }

    @objc func pinchDo(_ pinch: UIPinchGestureRecognizer) {//    
        guard let curObj = objM.lastUsedObject else { return }
        
        
        if pinch.state == .began {//            
            beginPinchScale = pinch.scale//            scale
            beginObjScale = curObj.scale.x//            scale
        }
        
        if pinch.state == .changed {
            //  ,     scale        scale,        scale     ,            
            var scale = beginObjScale*Float(pinch.scale/beginPinchScale)
            scale = scale<0.5 ? 0.5 : scale
            scale = scale>2 ? 2 : scale
            curObj.scale = SCNVector3.init(scale, scale, scale)
        }
    }
    
    @objc func panGuestDo(_ GG: UIPanGestureRecognizer) {//    
        guard let curObj = objM.lastUsedObject else { return }

        let location = GG.location(in: sceneView)
        let velocityPoint = GG.velocity(in: sceneView)

        switch GG.state {
        case .changed:
            if let touchedObj = virtualObject(at: location, inSceV: sceneView) {//  
                objM.translate(touchedObj, in: sceneView, basedOn: location, instantly: true)//    
                objM.lastUsedObject = touchedObj//        
            }else{//  
                let xx = Float(velocityPoint.x/5000)//       x     
                let yy = Float(velocityPoint.y/5000)//       y     
                curObj.eulerAngles.y += abs(xx) > abs(yy) ? xx : -yy
            }
        case .ended:
            return
        default:
            return
        }
    }

    var beginObjScale: Float = 1
    var beginPinchScale: CGFloat = 1
    @IBOutlet var sceneView: ARSCNView!