gpt4 book ai didi

ios - 如何将 ARPlaneAnchor 放置在与 ARImageAnchor 相同的位置

转载 作者:行者123 更新时间:2023-11-30 11:44:30 25 4
gpt4 key购买 nike

我尝试将 ARImageAnchor 放置在与 ARPlaneAnchor 相同的位置,但它不起作用。这是我的 renderer 函数的开头,我认为问题所在:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
...
}

当我注释掉与planeAnchor相关的所有内容时,它工作正常,但是一旦我尝试将它们放在同一位置,它仍然会编译,但不会检测到引用图像。有人以前见过这样的问题吗?谢谢!

更新:使用 sceneView 作为我的 ARSCNView,我使用以下代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

print("got here")
guard let touchLocation = touches.first?.location(in: sceneView),
let hitTest = sceneView?.hitTest(touchLocation, options: nil),
//let detectedPlane = planes[planeAnchor],
let nodeTapped = hitTest.first?.node,
let nodeName = nodeTapped.name else { return }
print("got here 2")

print(nodeName)

}

但是“gothere 2”永远不会被打印出来,当我点击飞机时也没有任何反应。我应该尝试什么?

最佳答案

进一步查看后,我认为这是不可能的。

如果您设置 ARWorldTrackingConfiguration 来检测飞机,例如:

  configuration.planeDetection = .horizontal

然后在委托(delegate)方法中添加此调试日志:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

print(anchor.classForCoder)

}

您将看到,当您检测到目标图像时,它将记录 ARImageAnchor,而如果检测到水平面,它将记录:ARPlaneAnchor

这就是为什么你的守卫语句没有执行:

 guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

仅仅因为不能同时有两个 anchor ......

有一个 ARPlaneAnchorARImageAnchor

基于您上次回复的更新,这将使您能够获取以下属性:

   func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }

//2. Get The Targets Name
let name = currentImageAnchor.referenceImage.name!

//3. Get The Targets Width & Height
let width = currentImageAnchor.referenceImage.physicalSize.width
let height = currentImageAnchor.referenceImage.physicalSize.height

//4. Log The Reference Images Information
print("""
Image Name = \(name)
Image Width = \(width)
Image Height = \(height)
""")
}

我仍然不明白为什么你还需要 PlaneAnchor,你可以用它来显示模型等:)

如果您想在该 anchor 添加一些内容,请尝试以下操作:

  /// Generates An SCNPlane On The Detected Image At The Size Of The Target
///
/// - Parameters:
/// - node: SCNNode
/// - width: CGFloat
/// - height: CGFloat
func generateModel(_ node: SCNNode, width: CGFloat, height: CGFloat){

let nodeToAdd = SCNNode()
let planeGeometry = SCNPlane(width: width, height: height)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.red
nodeToAdd.geometry = planeGeometry
nodeToAdd.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
node.addChildNode(nodeToAdd)
}

并在委托(delegate)方法中调用它:

 generateModel(node, width: width, height: height)

我认为这就是您想要实现的目标。

更新:要在添加的节点上获取 hitTest,只需使用 TouchBegan 例如

   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

guard let touch = touches.first?.location(in: self.augmentedRealityView),
let hitTest = self.augmentedRealityView?.hitTest(touch, options: nil),
let nodeTapped = hitTest.first?.node,
let nodeName = nodeTapped.name else { return }

print(nodeName)

}

更新:如果放置在 ImageAnchor 上的对象看起来摇摇欲坠,可能是您在 ARAssets Bundle 中错误地设置了 referenceImage 大小:

enter image description here

关于ios - 如何将 ARPlaneAnchor 放置在与 ARImageAnchor 相同的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48979812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com