Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ARKit:如何将一个导入的三维模型放置在另一个模型之上?_Ios_Swift_Arkit_Hittest - Fatal编程技术网

Ios ARKit:如何将一个导入的三维模型放置在另一个模型之上?

Ios ARKit:如何将一个导入的三维模型放置在另一个模型之上?,ios,swift,arkit,hittest,Ios,Swift,Arkit,Hittest,我正在使用ARKit进行AR项目 如果仅在点上触摸导入的三维对象,则希望在其上方放置另一个三维对象。 (例如,我放了一张桌子,我必须在上面的接触点上放置一个花瓶之类的东西) 当我触摸第一个3D对象时,如何解决仅放置第二个对象的问题 对象的表面不是平坦的,因此我不能使用带边界框的hittest。一种方法是为第一个导入的3D对象指定节点名 firstNode.name = “firstObject” 在你点击手势功能的内部,你可以做这样的点击测试 let tappedNode = self.s

我正在使用ARKit进行AR项目

如果仅在点上触摸导入的三维对象,则希望在其上方放置另一个三维对象。 (例如,我放了一张桌子,我必须在上面的接触点上放置一个花瓶之类的东西)

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


对象的表面不是平坦的,因此我不能使用带边界框的hittest。

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

 firstNode.name = “firstObject”
在你点击手势功能的内部,你可以做这样的点击测试

 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
 }
这样,当您点击其他任何位置时,第二个对象将不会被放置。仅当您点击节点本身时,才会放置该节点。点击节点的位置无关紧要,因为我们只需要高度&我们可以从它的边界框max-min中确定高度,然后将其添加到firstnode.worldPosition.y

确保设置在ArsknView类的顶部

 var firstNode = SCNNode! 
通过这种方式,我们可以访问轻触手势功能中的第一个节点

编辑:如果第一个三维模型有多个节点。您可以在场景图中展平父节点上的节点(下面的照片可以很好地说明这一点)。这将从场景图中删除所有子节点和换行。然后,您可以只使用parentNode


非常感谢!我有一个关于边界框的问题。我的第一个对象有多个节点。在将每个节点添加为childnode后,我是否应该为每个节点执行if-else条件?我更新了关于如何将节点展平(删除所有childnode)只保留parentNode的答案。让我知道这是否解决了你的问题。如果没有,我可能有另一种方法来解决边界框问题。注意:如果在dae上执行xcode时发生崩溃。。。首先将dae文件转换为scn文件。那就行了。