[英]Smooth Pinch Gesture for SceneKit IOS
我正在Arkit中為3D模型捏捏手勢,遇到一個問題,當我縮放模型時,它會滯后並且不能給我流暢的響應。 它工作正常,但我需要使其更平滑。
@objc func scalePiece(gestureRecognizer : UIPinchGestureRecognizer) { guard gestureRecognizer.view != nil else { return }
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let scale = Float(gestureRecognizer.scale)
let newscalex = scale / currentscalex
let newscaley = scale / currentscaley
let newscalez = scale / currentscalez
self.drone.scale = SCNVector3(newscalex, newscaley, newscalez)
}}
任何提示將不勝感激。
您可能在currentscale
和計算出的newscale
后面有一些邏輯,但是簡單的gestureRecognizer.scale
提供平滑的縮放。 我認為您會遇到麻煩的縮放比例,因為直接設置了scale
。 使用SCNAction.scale
let action = SCNAction.scale(by: gestureRecognizer.scale, duration: 0.1)
lv.runAction(action)
gestureRecognizer.scale = 1
代替
self.drone.scale = SCNVector3(newscalex, newscaley, newscalez)
如果x,y,z的比例尺值不同,請使用customAction
let action = SCNAction.customAction(duration: 0.1) { (yourNode, elapsedTime) in
let percentage = elapsedTime / 0.1
let newscalex = scale / currentscalex * percentage
let newscaley = scale / currentscaley * percentage
let newscalez = scale / currentscalez * percentage
yourNode.scale = SCNVector3(newscalex, newscaley, newscalez)
}
將所有三個軸的/都替換為*,並重置手勢識別器的比例。 換句話說,與標度相乘而不是除以標度。
為防止其按指數比例縮放,請在讀取后將其重新設置為1.0。 例如:
if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let scale = Float(gestureRecognizer.scale)
let newscalex = scale * self.drone.scale.x
let newscaley = scale * self.drone.scale.y
let newscalez = scale * self.drone.scale.z
self.drone.scale = SCNVector3(newscalex, newscaley, newscalez)
gestureRecognizer.scale = 1.0
}
重置手勢Recognizer基本上是一種替代方法,用於將原始比例存儲在開始狀態,並在將其分配給當前對象之前將識別器的比例因子應用於該比例。 重要說明中的文檔中專門描述了這種情況: https : //developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_pinch_gestures 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.