Я пытаюсь привязать 3D-объект к эталонному изображению, когда пользователь нажимает на scnplane.У меня есть штрихи, чтобы добавить новый трехмерный объект.Прямо сейчас я могу добавить трехмерный объект, но он не относится к эталонному изображению.
Мои вопросы: когда пользователь нажимает на scnplane, он показывает 3d-объект для ссылки и нажимает на другую scnplane, чтобы добавить новый 3d-объект и удаляет старый 3d-объект?
Вот код, который я пробовал:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.main.async {
guard let imageAnchor = anchor as? ARImageAnchor,
let imageName = imageAnchor.referenceImage.name else { return }
let rotationAsRadian = CGFloat(GLKMathDegreesToRadians(360))
// Check To See The Detected Size Of Our Menu Card (Should By 18cm*27cm)
let menuCardWidth = imageAnchor.referenceImage.physicalSize.width
let menuCardHeight = imageAnchor.referenceImage.physicalSize.height
print(
"""
We Have Detected menu Card With Name \(imageName)
\(imageName)'s Width Is \(menuCardWidth)
\(imageName)'s Height Is \(menuCardHeight)
""")
let plane = SCNPlane(width: menuCardWidth, height: menuCardHeight)
plane.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0.75)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 4
planeNode.runAction(SCNAction.moveBy(x: 0, y: 0, z: 0, duration: 0.75))
/******************Break fast*******************/
//BREAKFAST, FALTBREADS, SANDWICHES, ALLDAY
let labelPlane = SCNPlane(width: 0.065, height: 0.015)
labelPlane.firstMaterial?.diffuse.contents = UIImage(named: "BREAKFAST")
let lableNode = SCNNode(geometry: labelPlane)
self.lableNode = lableNode
lableNode.name = "lableNode"
lableNode.eulerAngles.x = -.pi / 2
lableNode.runAction(SCNAction.moveBy(x: 0.2, y: 0, z: -0.125, duration: 0))
node.addChildNode(lableNode)
self.sceneView.scene.rootNode.addChildNode(node)
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//1. Get The Current Touch Location & Perform An ARSCNHitTest To Check For Any Hit SCNNode's
guard let currentTouchLocation = touches.first?.location(in: self.sceneView),
let hitTestNode = self.sceneView.hitTest(currentTouchLocation, options: nil).first?.node else { return }
if let lableName = hitTestNode.name {
print("touch working")
if lableName == "lableNode"{
makeCakeOnNode(hitTestNode)
}
}
}
func makeCakeOnNode(_ node: SCNNode){
let overlayNode = self.getNode(withImageName: "imageName")
print("overlay::\(overlayNode)")
self.sceneView.scene.rootNode.addChildNode(overlayNode)
}