由于您没有发布任何代码,因此很难提供准确的答案。
然而,为了跟踪当前
SCNNode
您希望使用,当您加载模型等时,可以将其存储为变量,例如:
var currentNode: SCNNode!
您也可以使用
name
属性,以保留对其更具体的引用。
下面是一个这样做的示例:
func loadModel(){
let modelPath = "Character.scn"
guard let model = SCNScene(named: modelPath),
let modelObject = model.rootNode.childNode(withName: "Root", recursively: false) else { return }
modelObject.scale = SCNVector3(0.4, 0.4, 0.4)
augmentedRealityView.scene.rootNode.addChildNode(modelObject)
modelObject.position = SCNVector3(0, 0, -1.5)
currentNode = modelObject
currentNode.name = "Character"
}
您还可以使用
SCNHitTest
其中:
沿指定的光线查找SCNGeometry对象。对于每个
光线和几何体之间的交点,SceneKit创建
点击测试结果以提供有关SCNNode对象和
包含几何图形和交叉点的位置
几何曲面。
这可以用来区分哪些节点被击中,例如:
@objc func detectTap(_ gesture: UITapGestureRecognizer){
let currentTouchPoint = gesture.location(in: self.augmentedRealityView)
guard let nodeHitTest = self.augmentedRealityView.hitTest(currentTouchPoint, options: nil).first else { return }
if nodeHitTest.node == currentNode{
print("The Current Node Has Been Touched")
}
if nodeHitTest.node.name == "The Model"{
print("The Model Has Been Touched")
}
}
处理此问题的另一种方法是向视图中添加UITapgestureRecognitor,并根据结果启用交互,例如以这种方式设置currentNode,例如:
@objc func detectTap(_ gesture: UITapGestureRecognizer){
let currentTouchPoint = gesture.location(in: self.augmentedRealityView)
guard let nodeHitTest = self.augmentedRealityView.hitTest(currentTouchPoint, options: nil).first else { return }
currentNode = nodeHitTest.node
}
然后,您可以应用逻辑来确保
currentNode
移动等:
@objc func moveNode(_ gesture: UIPanGestureRecognizer) {
let currentTouchPoint = gesture.location(in: self.augmentedRealityView)
if gesture.state == .began{
guard let nodeHitTest = self.augmentedRealityView.hitTest(currentTouchPoint, options: nil).first else { return }
if nodeHitTest.node == currentNode{
if gesture.state == .changed{
guard let hitTest = self.augmentedRealityView.hitTest(currentTouchPoint, types: .existingPlane).first else { return }
let worldTransform = hitTest.worldTransform
let newPosition = SCNVector3(worldTransform.columns.3.x, worldTransform.columns.3.y, worldTransform.columns.3.z)
currentNode.simdPosition = float3(newPosition.x, newPosition.y, newPosition.z)
}
}
}
}
这应该足以为您指明正确的方向。。。