ARKit 在场景中放置一个自定义对象

ARKit drop a custom object in the scene

我正在使用新的 ARKit,我能够创建一个名为 SphereNode 的新文件,该文件能够在视图上创建一个 Sphere droppable。

关键是我真的想添加一个自定义对象而不是标准球体。一些建议?这是用于创建 Sphere 的代码:

import SceneKit

class SphereNode: SCNNode {
    init(position: SCNVector3) {
        super.init()
        let sphereGeometry = SCNSphere(radius: 0.005)
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.red
        material.lightingModel = .physicallyBased
        sphereGeometry.materials = [material]
        self.geometry = sphereGeometry
        self.position = position
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

要使用自定义几何体而不是提供的几何体,最好的办法是使用外部编辑器来创建场景,例如 Blender,它也是开源的,可选择添加材质和纹理,然后将其导出为 iOS 可以使用的格式,例如 DAE。在你的应用程序中,你可以加载这个文件并获得一个 SCNScene 及其适当的初始化程序。加载场景后,您可以直接使用它来向用户显示或导航它以仅获取您想要使用的 node/geometry/material 然后随意使用,例如将它添加到已经存在的场景中。

  1. 假设您的文件名为 scene.dae 并且位于您的应用程序主包中,那么您可以将其加载为

    let scene = SCNScene(named: “scene.dae”)
    

    或者,如果您愿意,也可以指定一个完整的 URL,请参阅 documentation 以了解更多详细信息,请注意,这些是可失败的初始化程序,因此请检查 nil。

  2. 假设具有自定义几何形状和纹理的节点是场景中的唯一对象,然后您可以使用

    获取对它的引用
    let obj = scene.rootNode.childNodes.first
    

    请注意,这也是可选的,因此请检查 nil 值,如果我的假设不正确,您可以参考 SCNNode documentation 了解如何导航节点图,scene.rootNode 始终是您的起点点.

  3. 现在你有了我之前说过的场景和对象,你有两个选择:link场景直接到你的SCNView(我不知道 ARKit 但我猜你有一个)而不是手动创建一个空的,或者只取 object/geometry/material 并通常将它添加到你已经创建的场景中。

如果你的对象不是静态的而是动态生成的,你也可以通过构建一个SCNGeometry来逐点创建它,这样做有点棘手,你可以使用my library,因为我创建了一些有用的功能和 类 来帮助这个过程。