【问题标题】:ARKit: How to place one imported 3D model above another?ARKit:如何将一个导入的 3D 模型放在另一个之上?
【发布时间】:2018-02-05 08:15:10
【问题描述】:

我正在使用 ARKit 开发一个 AR 项目。

如果我只在一个点上触摸导入的 3D 对象,我想在其上方放置另一个 3D 对象。 (例如,我放置了一张桌子,上面我必须在触摸点上放置其他东西,例如花瓶)。

如何解决当我触摸第一个 3D 对象时只能放置第二个对象的问题?

物体表面不平整,所以不能用hittest和bounding box。

【问题讨论】:

    标签: ios swift arkit hittest


    【解决方案1】:

    一种方法是为第一个导入的 3D 对象指定一个节点名称。

     firstNode.name = “firstObject”
    

    在你轻按的手势功能中,你可以像这样进行 hitTest

     let tappedNode = self.sceneView.hitTest(location, options: [:])
    
      let node = tappedNode[0].node
    
     if node.name == “firstObject” {
    
        let height = firstNode.boundingBox.max.y -firstNode.boundingBox.min.y
    
    
       let position2ndNode = SCNVector3Make(firstNode.worldPosition.x, (firstNode.worldPosition.y + height), firstNode.worldPosition.z)
    
    
      2ndNode.position = position2ndNode
    
    sceneView.scene.rootNode.addChildNode(2ndNode)
    
     } else {
          return
     }
    

    这样,当您点击其他任何地方时,第二个对象将不会被放置。它只会在您点击节点本身时放置。在节点上点击的位置无关紧要,因为我们只需要高度,我们可以从它的 boundingBox max - min 确定它,然后我们将其添加到 firstnode.worldPosition.y

    确保您设置在 ARSCNView 类的顶部

     var firstNode = SCNNode! 
    

    这样我们就可以在点击手势函数中访问firstNode了。

    编辑:如果第一个 3D 模型有很多节点。您可以在 sceneGraph 中的父节点上 flattenNode(最好用下图说明)。这将删除所有 childNodes 并从 sceneGraph 中包装。然后,您可以只使用父节点。

    【讨论】:

    • 非常感谢!我有一个关于边界框的问题。我的第一个对象有多个节点。将每个节点添加为子节点后,我应该为每个节点执行 if-else-condition 吗?
    • 我更新了关于如何 flattenNode(删除所有 childNodes)只留下 parentNode 的答案。让我知道这是否能解决您的问题。如果不是,我可能有另一种方法来解决 boundingBox 问题。注意:如果在 dae 上执行此操作时 xcode 崩溃...首先将 dae 文件转换为 scn 文件。然后就可以了。
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 2022-11-18
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2012-04-27
    • 2023-03-30
    相关资源
    最近更新 更多