繁体   English   中英

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 加载场景后,您可以直接使用它显示给用户或浏览它以仅获取要使用的节点/几何体/材质,然后根据需要将其添加到现有场景中。

  1. 假设您的文件名为scene.dae ,位于应用程序主捆绑包中,然后您可以将其加载为

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

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

  2. 假设您的节点具有其自定义的几何形状和纹理是场景中唯一的对象,然后可以通过以下方式获取对该节点的引用

     let obj = scene.rootNode.childNodes.first 

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

  3. 现在,您已经有了我前面说过的场景和对象,您有两种选择:直接将场景链接到SCNView (我不知道ARKit,但我想您有一个场景),而不是手动创建一个空的场景,或者只选择一个对象/几何/材质,通常将其添加到已经创建的场景中。

如果您的对象不是静态的而是动态生成的,则还可以通过构建SCNGeometry逐点创建它,这样做有点棘手,您可以使用我的库,因为我创建了一些有用的函数和类来辅助该过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM