iOS ARKitジェスチャードラッグ、回転、スケール3 Dモデル
2194 ワード
Arジェスチャー
公式ARKitドキュメントのサンプルコードに基づく
Swift 4.2コアジェスチャーコードは以下の通りです.
公式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!