ARKit:如何将一个导入的3D模型放在另一个上面?

时间:2018-02-05 08:15:11

标签: ios swift arkit hittest

我正在使用ARKit开展AR项目。

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

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

物体的表面不平坦,所以我不能在边界框中使用hittest。

1 个答案:

答案 0 :(得分:0)

一种方法是为第一个导入的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(最好用下面的照片说明)。这将从sceneGraph中删除所有childNodes和wrap。然后,您可以使用parentNode。

enter image description here