gpt4 book ai didi

ios - 使用 ARKit 显示 DAE 文件并跟踪场景中的 anchor

转载 作者:IT王子 更新时间:2023-10-29 05:25:14 27 4
gpt4 key购买 nike

我正在试用 ARKit,我使用 this tutorial 设置了一个 ARSCNView .

然后使用 this tutorial. 的第二部分设置跟踪水平 3D 平面

我创建了一个单一 View 应用程序,然后将 ARSCNView 刷新到 Root View ,并使用我的 ViewController 的导出。

这是 ViewController 中的代码:

import UIKit
import ARKit

class ViewController: UIViewController {

//MARK: Properties
@IBOutlet weak var arScene: ARSCNView!

//MARK: ARKit variables
var realityConfiguration: ARWorldTrackingSessionConfiguration?

//MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.prepare()
}

//MARK: Actions

//MARK: Overrides
}

extension ViewController {
func prepare() {
//Check to see if active reality is supported
guard ARSessionConfiguration.isSupported else {
//Custom alert function that just quickly displays a UIAlertController
AppDelegate.alert(title: "Not Supported", message: "Active Reality is not supported on this device")
return
}
//Set up the ARSessionConfiguration
self.realityConfiguration = ARWorldTrackingSessionConfiguration()
//Set up the ARSCNView
guard let config = self.realityConfiguration else {
return
}
//Run the ARSCNView and set its delegate
self.arScene.session.run(config)
self.arScene.delegate = self
}
}

extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
return nil
}

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

let plane = SCNPlane(width: CGFloat(planAnchor.extent.x), height: CGFloat(planAnchor.extent.z))
let planeNode = SCNNode(geometry: plane)
planeNode.position = SCNVector3Make(planAnchor.center.x, 0, planAnchor.center.z)

planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)

node.addChildNode(planeNode)
}

func renderer(_ renderer: SCNSceneRenderer, willUpdate node: SCNNode, for anchor: ARAnchor) {
print("Will updated Node on Anchor: \(anchor.identifier)")
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
print("Did updated Node on Anchor: \(anchor.identifier)")
}

func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) {
print("Removed Node on Anchor: \(anchor.identifier)")
}
}

我下载了 Xcode 9 beta,按照 Apple 的教程进行操作,发现我的 iPhone 6 没有 ARWorldTrackingSessionConfiguration 对象所需的 A9 芯片。

在我链接的第一个教程的大约一半处,Apple 表示您仍然可以在没有 A9 芯片的情况下创造 AR 体验。但是,他们没有进一步详细说明。有没有其他人找到一个起点,并愿意提供一个使用 .dae 文件的代码示例和

  • 选择一个 anchor 来显示它
  • 跟踪那个 anchor
  • 实际显示 .dae 文件

最佳答案

使用您的代码并没有什么可看的——只是一个实时摄像头 View 。

您在现实中看不到任何增强的主要原因是您的代码仅在将 anchor 添加到 ARSession 时才将 SceneKit 内容添加到场景...但您不是手动添加任何 anchor ,并且您还没有启用平面检测,因此 ARKit 不会自动添加 anchor 。如果您启用平面检测,您将开始到达某个地方...

self.realityConfiguration = ARWorldTrackingSessionConfiguration()
realityConfiguration?.planeDetection = .horizontal

但您仍然看不到任何东西。那是因为您的 ARSCNViewDelegate 实现有冲突的指令。这部分:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
return nil
}

...意味着不会为您的 anchor 创建任何 SceneKit 节点。因为没有节点,您的 renderer(_:didAdd:for:) 函数永远不会被调用,所以您在该方法中的代码永远不会创建任何 SceneKit 内容。

如果你打开平面检测并删除/注释掉 renderer(_: nodeFor:) 方法,你的代码的其余部分应该是这样的:

(纯白色区域是您的SCNPlane。我不得不在白色 table 上展开我的 iPad 外壳以获得足够的场景细节以进行平面检测以找到任何东西。另外,检查背景......那里实际上是今天在 WWDC 上的一个时刻,当时商品商店并没有挤满人。)

至于你是否需要 A9,苹果在这里的信息有点不清楚。当他们说 ARKit 需要 A9 或更好时,他们真正的意思是 ARWorldTrackingSessionConfiguration 需要。这就是所有最好的 AR 魔法所在。 (甚至还有一个用于 arkitUIRequiredDeviceCapabilities 键,它实际上涵盖了具有世界跟踪支持的设备,因此您可以将 App Store 上的应用限制为仅提供给这些设备。)

不过,仍然有一些没有世界跟踪的 ARKit。与基类运行 session ARSessionConfiguration然后您将获得仅限方向的跟踪。 (没有位置跟踪,没有平面检测,没有 HitTest 。)

这给你带来了什么?嗯,如果你玩过当前版本的 Pokémon GO,它的工作原理是这样的:因为它只跟踪设备方向,而不是位置,你不能靠近皮卡丘或在他身后走来走去——他占据真实世界的错觉只要您只倾斜或转动您的设备而不移动它,世界就会保持不变。

您使用 SceneKit 加载 3D 内容并将其放置在 AR 中,就像您将其加载并放置在任何其他 SceneKit 应用程序/游戏中一样。有很多资源可以做到这一点,也有很多方法可以做到这一点。当您创建一个新的 AR 项目并选择 SceneKit 时,您会在 Xcode 模板中找到其中一个。加载部分是这样的:

let scene = SCNScene(named: "ship.scn" inDirectory: "assets.scnassets")
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)

然后放置它:

ship.simdPosition = float3(0, 0, -0.5) 
// half a meter in front of the *initial* camera position
myARSCNView.scene.rootNode.addChildNode(ship)

要记住在 AR 中放置东西的主要区别在于位置是以米为单位测量的(并且您的内容需要设计成以米为单位合理调整大小)。

关于ios - 使用 ARKit 显示 DAE 文件并跟踪场景中的 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44402389/

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