【问题标题】:Building a 3D cube in iOS with two gestures在 iOS 中使用两个手势构建 3D 立方体
【发布时间】:2017-06-06 08:00:02
【问题描述】:

我可以使用下面的代码在 iOS 中自动创建一个 3D 立方体。

问题是:如何用两个手势构建一个 3D 立方体?

通过捏合手势,我想在 XZ 轴上构建一个立方体底座。

然后用拖动手势我想在Y轴上构建一个高度的立方体。

怎么做?

import UIKit
import SceneKit

class GameViewController: UIViewController {
    var scnView: SCNView!
    var scnScene: SCNScene!
    var cameraNode: SCNNode!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
        setupScene()
        setupCamera()
        spawnShape()
    }

    override func shouldAutorotate() -> Bool {
        return true
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }

    func setupView() {
        scnView = self.view as! SCNView
        scnView.allowsCameraControl = true
        scnView.autoenablesDefaultLighting = true
    }

    func setupScene() {
        scnScene = SCNScene()
        scnView.scene = scnScene
        scnScene.background.contents = "BG.scnassets/BgTexture.png"
    }

    func setupCamera() {
        cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 12)
        scnScene.rootNode.addChildNode(cameraNode)
    }    

    func spawnShape() {
        var geometry: SCNGeometry

        switch ShapeType.random() {
        case .Box:
        geometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.1)
        }

        let geometryNode = SCNNode(geometry: geometry)
        scnScene.rootNode.addChildNode(geometryNode)
    }
}   

我尝试实现UIPinchGestureRecognizer() 和UIPanGestureRecognizer() 子类,但我失败了。不知道怎么弄。

var pinchGesture = UIPinchGestureRecognizer()
var dragGesture = UIPanGestureRecognizer()

override func viewDidLoad() {
    super.viewDidLoad()
    setupView()
    setupScene()
    setupCamera()
    spawnShape()

    self.scnView.userInteractionEnabled = true
    self.scnView.multipleTouchEnabled = true

    self.pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecognized(_:)))
    self.dragGesture = UIPanGestureRecognizer(target: self, action: #selector(panRecognized(_:)))
    self.scnView.addGestureRecognizer(self.pinchGesture)
    self.scnView.addGestureRecognizer(self.dragGesture)
}

@IBAction func pinchRecognized(pinch: UIPinchGestureRecognizer) {
    ........
}
@IBAction func panRecognized(pan: UIPanGestureRecognizer) {
    ........
}

【问题讨论】:

  • 你有没有尝试过?如果您尝试自己实现它,这听起来是一项非常重要的任务。
  • 所以发布您尝试过的代码并解释它是如何不起作用的。
  • 您不能使用将您的宽度和长度比例设置为 pinchgesture 比例并在每次调用时将 pinchgesturescale 重置为 1.0 吗?这将实现增量增长。
  • 与代码/实现无关;关于 UX 的一个想法:几十年来,我使用了很多 3D 设计应用程序,包括用于 iPad Pro 等的新 iOS 应用程序。对于最初的平面创建,我认为单点触摸和拖动操作将是巨大的,而不是捏更好的。用户可以从任何角落开始,并沿所需方向拖动以创建基本平面。完成此操作后,让他们满意的是,让他们添加第二根手指并向上或向下拖动以将平面挤压成 3D 立方体,或者释放并用一根手指再次拖动以执行相同操作。

标签: 3d swift2 ios9 scenekit gesture


【解决方案1】:

您可以使用UIGestureRecognizers 来完成您要查找的内容。

在您的ViewDidLoad() 中添加您的识别器:

    // Add Gesture recognizers
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:)))
    scnView.addGestureRecognizer(pinch)

现在可以通过以下方式实现 XZ 方向的增量缩放:

func scaleSizeOfGeometry(sender: UIPinchGestureRecognizer) {
    let scale = Float(sender.scale)
    referenceToGeometry?.scale.x *= scale
    referenceToGeometry?.scale.z *= scale
    sender.scale = 1.0
}

您必须以某种方式引用要缩放的几何图形。例如,在 spawnGeometry() 中设置的变量 referenceToGeometry : SCNNode?:

referenceToGeometry = geometryNode

UIPanGestureRecognizer 有点棘手,因为您可以使用速度或平移在 Y 方向上进行缩放。在您的 viewDidLoad() 添加手势识别器:

let pan = UIPanGestureRecognizer(target: self, action: #selector(scaleHeightOfGeometry(sender:)))
scnView.addGestureRecognizer(pan)

在你的函数中使用速度或平移:

func scaleHeightOfGeometry(sender: UIPanGestureRecognizer) {
    // y : sender.translation(in: self.scnView).y
    // v : sender.velocity(in: self.scnView).y
}

您必须根据自己的喜好从其中任何一个中提取乘数。例如,通过存储 y[i-1] 并检查两者之间的差异,而不是将差异添加到几何图形的高度并将 newValue 存储为第 y[i-1] 个值。

编辑:

要添加到帖子中,您可以使用 UIGestureRecognizer states 获得更高级/微调的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2021-08-06
    • 2021-02-16
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多