【发布时间】:2018-02-05 08:15:10
【问题描述】:
我正在使用 ARKit 开发一个 AR 项目。
如果我只在一个点上触摸导入的 3D 对象,我想在其上方放置另一个 3D 对象。 (例如,我放置了一张桌子,上面我必须在触摸点上放置其他东西,例如花瓶)。
如何解决当我触摸第一个 3D 对象时只能放置第二个对象的问题?
物体表面不平整,所以不能用hittest和bounding box。
【问题讨论】:
我正在使用 ARKit 开发一个 AR 项目。
如果我只在一个点上触摸导入的 3D 对象,我想在其上方放置另一个 3D 对象。 (例如,我放置了一张桌子,上面我必须在触摸点上放置其他东西,例如花瓶)。
如何解决当我触摸第一个 3D 对象时只能放置第二个对象的问题?
物体表面不平整,所以不能用hittest和bounding box。
【问题讨论】:
一种方法是为第一个导入的 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 中包装。然后,您可以只使用父节点。
【讨论】: