ARKit에서 제스처를 사용하여 객체 크기 조정 및 회전
그럴 때 사용할 수 있는 손가락 제스처를 사용한 물체를 조종하기 위한 구현을 소개합니다.
핀치 인 아웃으로 확대 축소
UIPinchGestureRecognizer 구현
viewDidLoad 등으로 gesture를 add합니다.
// scale gesture
let pinch = UIPinchGestureRecognizer(
target: self,
action: #selector(type(of: self).scenePinchGesture(_:))
)
pinch.delegate = self
sceneView.addGestureRecognizer(pinch)
제스처에서 호출되는 메서드 정의
@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer) {
if recognizer.state == .began {
lastGestureScale = 1
}
let newGestureScale: Float = Float(recognizer.scale)
// ここで直前のscaleとのdiffぶんだけ取得しときます
let diff = newGestureScale - lastGestureScale
let currentScale = boxNode.scale
// diff分だけscaleを変化させる。1は1倍、1.2は1.2倍の大きさになります。
boxNode.scale = SCNVector3Make(
currentScale.x * (1 + diff),
currentScale.y * (1 + diff),
currentScale.z * (1 + diff)
)
// 保存しとく
lastGestureScale = newGestureScale
}
회전
UIRotationGestureRecognizer 정의
// rotate gesture
let rotaion = UIRotationGestureRecognizer(
target: self,
action: #selector(type(of: self).sceneRotateGesture(_:))
)
rotaion.delegate = self
sceneView.addGestureRecognizer(rotaion)
제스처로 불리는 메소드 정의
@objc func sceneRotateGesture(_ recognizer: UIRotationGestureRecognizer) {
let newGestureRotation = Float(recognizer.rotation)
if recognizer.state == .began {
lastGestureRotation = 0
}
// 前回とのdiffを取得
let diff = newGestureRotation - lastGestureRotation
// 今回はオイラーアングルのyを取るため、y軸中心の回転をさせます。
let eulerY = boxNode.eulerAngles.y
boxNode.eulerAngles.y = eulerY - diff
lastGestureRotation = newGestureRotation
}
요약
// scale gesture
let pinch = UIPinchGestureRecognizer(
target: self,
action: #selector(type(of: self).scenePinchGesture(_:))
)
pinch.delegate = self
sceneView.addGestureRecognizer(pinch)
@objc func scenePinchGesture(_ recognizer: UIPinchGestureRecognizer) {
if recognizer.state == .began {
lastGestureScale = 1
}
let newGestureScale: Float = Float(recognizer.scale)
// ここで直前のscaleとのdiffぶんだけ取得しときます
let diff = newGestureScale - lastGestureScale
let currentScale = boxNode.scale
// diff分だけscaleを変化させる。1は1倍、1.2は1.2倍の大きさになります。
boxNode.scale = SCNVector3Make(
currentScale.x * (1 + diff),
currentScale.y * (1 + diff),
currentScale.z * (1 + diff)
)
// 保存しとく
lastGestureScale = newGestureScale
}
UIRotationGestureRecognizer 정의
// rotate gesture
let rotaion = UIRotationGestureRecognizer(
target: self,
action: #selector(type(of: self).sceneRotateGesture(_:))
)
rotaion.delegate = self
sceneView.addGestureRecognizer(rotaion)
제스처로 불리는 메소드 정의
@objc func sceneRotateGesture(_ recognizer: UIRotationGestureRecognizer) {
let newGestureRotation = Float(recognizer.rotation)
if recognizer.state == .began {
lastGestureRotation = 0
}
// 前回とのdiffを取得
let diff = newGestureRotation - lastGestureRotation
// 今回はオイラーアングルのyを取るため、y軸中心の回転をさせます。
let eulerY = boxNode.eulerAngles.y
boxNode.eulerAngles.y = eulerY - diff
lastGestureRotation = newGestureRotation
}
요약
샘플 코드
htps : // 기주 b. 코 m / k 보 y-시 lゔぇrgym / 아 의 Gesture를 확인하십시오!
Reference
이 문제에 관하여(ARKit에서 제스처를 사용하여 객체 크기 조정 및 회전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kboy/items/8c6af0483bae67d37354
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(ARKit에서 제스처를 사용하여 객체 크기 조정 및 회전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kboy/items/8c6af0483bae67d37354텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)