点击 scnplane 时如何将 3d 对象添加到参考图像?
How to add 3d object to reference image when tapping on scnplane?
我正在尝试在用户点击 scnplane 时将 3d 对象设为参考图像。我开始接触到 scnplane 以添加新的 3d 对象。现在我可以添加 3d 对象,但它没有引用参考图像。
我的问题是,当用户点击 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)
}
创建了新的 scnplane 并添加了 3d 对象作为新 scnplane 的子对象
func makeCakeOnNode(_ node: SCNNode){
let planeGeometry = SCNPlane(width: 0.18 , height: 0.15)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(1)
planeNode0 = SCNNode(geometry: planeGeometry)
planeNode0?.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))
let overlayNode = self.getNode(withImageName: "menu")
print("overlay::\(overlayNode)")
if planeBool == true {
planeNode1?.isHidden = true
node.addChildNode(planeNode0!)
planeNode0?.addChildNode(overlayNode)
planeBool = false
} else {
print("plane removed")
planeNode0?.isHidden = true
planeBool = true
}
}
现在可以正常使用了!!
我正在尝试在用户点击 scnplane 时将 3d 对象设为参考图像。我开始接触到 scnplane 以添加新的 3d 对象。现在我可以添加 3d 对象,但它没有引用参考图像。
我的问题是,当用户点击 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)
}
创建了新的 scnplane 并添加了 3d 对象作为新 scnplane 的子对象
func makeCakeOnNode(_ node: SCNNode){
let planeGeometry = SCNPlane(width: 0.18 , height: 0.15)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(1)
planeNode0 = SCNNode(geometry: planeGeometry)
planeNode0?.runAction(SCNAction.moveBy(x: -0.2, y: -0.15, z: 0, duration: 0))
let overlayNode = self.getNode(withImageName: "menu")
print("overlay::\(overlayNode)")
if planeBool == true {
planeNode1?.isHidden = true
node.addChildNode(planeNode0!)
planeNode0?.addChildNode(overlayNode)
planeBool = false
} else {
print("plane removed")
planeNode0?.isHidden = true
planeBool = true
}
}
现在可以正常使用了!!