查看您的代码,我可以看到几个问题(更不用说变量和方法的命名约定)。
首先,你在创造一个
Global Variable
var cake_1_PlaneNode : SCNNode? = nil
Local
全局变量
cake_1_PlaneNode
在你的
Delegate Callback
:
let cake_1_PlaneNode = SCNNode(geometry: cake_1_Plane)
self.cake_1_PlaneNode = cake_1_PlaneNode
self.cake_1_PlaneNode = SCNNode(geometry: cake_1_Plane)
第二,你正在添加你的
蛋糕\u 1 \u平面节点
rootNode
你的
ARSCNView
而不是你的
ARImageAnchor
这可能是你不想做的,因为
ARAnchor
可以通过附着几何图形为锚定提供视觉内容
因此,这种方法(除非你真的想这样做)是不必要的。
cake_1
功能本身。
首先,你并不是真的在添加你的
planeNodee
给你的
sceneHierachy
因为你还没有指定
planeNode
ARSCNView公司
childNode
你的
cake_1_planeNode
你的
function
应包括以下内容之一:
self.sceneView.scene.rootNode.addChildNode(planeNodee)
self.cake_1_planeNode.addChildNode(planeNodee)
平面节点
因为默认情况下
SCNPlane
垂直渲染。
因为你还没有规定你将在哪里放置你的内容,它可能是使用
-.pi / 2
另一个问题,也可以解释你没有看到你的节点,当你实际添加它,是Z位置。
Z-fighting
(您可以阅读更多
here
). 因此,在添加节点时,您可能应该稍微向前移动添加的节点。
SCNVector3 (0,0,0.001)
来解释这个。
基于所有这些观点,我提供了一个完整的工作和评论的例子如下:
import UIKit
import ARKit
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. Check We Have An ARImageAnchor, Then Get It's Reference Image & Name
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let detectedTarget = imageAnchor.referenceImage
guard let detectedTargetName = detectedTarget.name else { return }
//2. If We Have Detected Our Virtual Menu Then Add The CakeOnePlane
if detectedTargetName == "cakeMenu" {
let cakeOnePlaneGeometry = SCNPlane(width: 0.045, height: 0.045)
cakeOnePlaneGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
cakeOnePlaneGeometry.cornerRadius = 0.01
let cakeOnPlaneNode = SCNNode(geometry: cakeOnePlaneGeometry)
cakeOnPlaneNode.eulerAngles.x = -.pi/2
//3. To Allow Us To Easily Keep Track Our Our Currently Added Node We Will Assign It A Unique Name
cakeOnPlaneNode.name = "Strawberry Cake"
node.addChildNode(cakeOnPlaneNode)
cakeOnPlaneNode.runAction(SCNAction.moveBy(x: 0.15, y: 0, z: 0, duration: 0.75))
}
}
}
class ViewController: UIViewController {
@IBOutlet var augmentedRealityView: ARSCNView!
let augmentedRealitySession = ARSession()
let configuration = ARWorldTrackingConfiguration()
//------------------
//MARK: - Life Cycle
//------------------
override func viewDidLoad() {
super.viewDidLoad()
setupARSession()
}
//-----------------
//MARK: - ARSession
//-----------------
/// Runs The ARSession
func setupARSession(){
//1. Load Our Detection Images
guard let detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return }
//2. Configure & Run Our ARSession
augmentedRealityView.session = augmentedRealitySession
augmentedRealityView.delegate = self
configuration.detectionImages = detectionImages
augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}
//--------------------
//MARK: - Interaction
//--------------------
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.augmentedRealityView),
let hitTestNode = self.augmentedRealityView.hitTest(currentTouchLocation, options: nil).first?.node else { return }
//2. If We Have Hit Our Strawberry Cake Then We Call Our makeCakeOnNode Function
if let cakeID = hitTestNode.name, cakeID == "Strawberry Cake"{
makeCakeOnNode(hitTestNode)
}
}
/// Adds An SCNPlane To A Detected Cake Target
///
/// - Parameter node: SCNNode
func makeCakeOnNode(_ node: SCNNode){
let planeGeometry = SCNPlane(width: 0.15 , height: 0.15)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.black.withAlphaComponent(0.75)
let planeNode = SCNNode(geometry: planeGeometry)
planeNode.position = SCNVector3(0, 0, 0.001)
planeNode.runAction(SCNAction.moveBy(x: 0.21, y: 0, z: 0, duration: 0))
node.addChildNode(planeNode)
}
}
在我的设备上产生以下结果:
为您提供信息,这似乎表明您放置内容的计算是关闭的(当然,除非这是期望的结果)。
如您所见,所有内容都正确呈现,但是这些内容的间距相当大,因此,在进一步测试和开发时,您可能需要稍微平移设备才能看到所有内容。
希望对你有帮助。。。