我正在使用ARKit开展AR项目。
如果我只触摸某个点上导入的3D对象,我想在其上方放置另一个3D对象。 (比如我放了一张桌子,我必须在触摸点上放一些像花瓶一样的东西。)
当我触摸第一个3D对象时,如何解决第二个对象应该只放置的问题?
物体的表面不平坦,所以我不能在边界框中使用hittest。
答案 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。