[英]SceneKit camera node resets on pinch gesture
我試圖在捏手勢上實現縮放,但每當我第二次捏時,模型會自行重置。
func zoom(scale: Double){
self.cameraNode.camera!.xFov = scale
self.cameraNode.camera!.yFov = scale
}
func handlePinch(gestureRecognize: UIPinchGestureRecognizer) {
if gestureRecognize.numberOfTouches() == 2 {
let zoom = gestureRecognize.scale
if (gestureRecognize.state == UIGestureRecognizerState.Began){
startScale = lastScale
bimScene.zoom(startScale)
}
if (gestureRecognize.state == UIGestureRecognizerState.Changed){
startScale = Double(100/zoom)
bimScene.zoom(startScale)
}
if (gestureRecognize.state == UIGestureRecognizerState.Ended){
lastScale = startScale
}
}
}
我仍然是scenekit的新手,所以我覺得這很奇怪。 有人能解釋一下這個原因嗎?
你很親密,邏輯有點偏。
開始的情況很好,您需要“記住”捏合開始的比例,這可能是您上次縮放時設置的比例。
您更改的案例有兩個問題。
startScale = Double(100/zoom)
僅基於手勢識別器刻度, startScale = Double(100/zoom)
度僅適用於當前捏(因此每次捏合都會重置)。 這需要基於GR標度,並且在夾點開始時“記住”標度。 startScale
重置為新值。 這給出了“指數”類型的縮放效果; 你不想要這個。 結束的情況只需要設置比例值,這樣我們就可以記住下一次捏合的開始。 在這種情況下,它可能有點多余,您可能會使用startScale = startScale * zoom
並且在開始的情況下根本沒有任何內容。
沒有測試下面,但希望它給你一些想法。 您傳遞到zoom
功能的值實際上是視角的視野,因此我重命名了它以區別於各種比例。 FOV將在30-60deg之間,而尺度更像是在0.1-10(非常粗略)的范圍內。
func handlePinch(gestureRecognize: UIPinchGestureRecognizer) {
if gestureRecognize.numberOfTouches() == 2 {
let zoom = gestureRecognize.scale
if (gestureRecognize.state == UIGestureRecognizerState.Began){
startScale = lastScale
} else if (gestureRecognize.state == UIGestureRecognizerState.Changed){
let fov = Double(100/(startScale * zoom))
bimScene.zoom(fov)
} else {
lastScale = startScale * zoom
}
}
}
這是處理特定節點的ZOOM的另一種方法,如果有任何需要在不改變攝像機視角的情況下實現這一點。
-(void)handlePinch:(UIPinchGestureRecognizer*)gestureRecognizer {
if (gestureRecognizer.numberOfTouches == 2) {
CGFloat zoom = gestureRecognizer.scale;
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
lastScale = yourNode.scale.x;
} else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
double final = lastScale * zoom;
yourNode.scale = SCNVector3Make(final, final, final);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.