【问题标题】:How to Zoom .DAE 3D model using ARKit iOS如何使用 ARKit iOS 缩放 .DAE 3D 模型
【发布时间】:2018-02-06 11:34:40
【问题描述】:

我有一个带有 .scn 扩展名的 3D 模型。如何在没有来自 iOS 示例放置对象应用程序的 virtualobject 文件的情况下使用捏合手势进行缩放。

如果从 .obj 文件转换而来的 .scn 文件,捏合手势效果很好。但它不适用于 .dae 模型。

    func addPinchGestureToSceneView() {

        pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale))
        pinchGesture.scale = 1.0;
        pinchGesture.delegate = self
        self.sceneView.addGestureRecognizer(pinchGesture)
    }
  private func node(at position: CGPoint) -> SCNNode? {
        var hitTestOptions = [SCNHitTestOption: Any]()
        hitTestOptions[SCNHitTestOption.boundingBoxOnly] = true
        return sceneView.hitTest(position, options: hitTestOptions)
            .first(where: { self.getOnlyModelName(name: $0.node.name ?? "") == self.currentmodel.modelname})?
            .node

    }

 @objc func scale(_ gesture: UIPinchGestureRecognizer) {

        if self.currentmodel.isZoomEnabled == false{
            return
        }

        let location = gesture.location(in: sceneView)

        guard let node = node(at: location)else{return}

    //    guard let node = node(at: location) else  { return }

        switch gesture.state {
        case .began:
            originalScale = node.scale
            gesture.scale = CGFloat(node.scale.x)
            print("Begin:: \(originalScale)")
        case .changed:
            guard var originalScale = originalScale else { return }
            if gesture.scale > 2.0{
                return
            }
            originalScale.x = Float(gesture.scale)
            originalScale.y = Float(gesture.scale)
            originalScale.z = Float(gesture.scale)
            node.scale = originalScale
        case .ended:

            guard var originalScale = originalScale else { return }
            if gesture.scale > 2.0{
                return
            }
            originalScale.x = Float(gesture.scale)
            originalScale.y = Float(gesture.scale)
            originalScale.z = Float(gesture.scale)
            node.scale = originalScale
            gesture.scale = CGFloat(node.scale.x)

        default:
            gesture.scale = 1.0
            originalScale = nil
        }

【问题讨论】:

  • 你试过什么?代码?
  • 提供代码以获取更多详细信息。
  • 可能与您加载模型的方式有关。你的node(at:) 是否返回零?
  • 是...有时是 DAE 根节点的子节点

标签: arkit scnnode scnscene arscnview


【解决方案1】:

当它是一个 dae 时,您可能需要尝试抓取在命中测试中捕获的节点的父节点。我有一个与 dae 类似的问题,通过让孩子的父母,甚至有时是孩子的祖父母来解决。

【讨论】:

  • 我也面临同样的问题,我按照你在命中测试中回答父节点的方法进行了尝试,但不起作用,你能分享你的代码吗?
猜你喜欢
  • 2017-12-24
  • 2018-05-08
  • 2017-12-21
  • 2020-10-03
  • 2018-01-31
  • 2016-02-25
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多