簡體   English   中英

SceneKit相機節點重置捏手勢

[英]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標度,並且在夾點開始時“記住”標度。
  • 您還將已更改的case中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM