【问题标题】:ARKit transform whole sceneARKit 变换整个场景
【发布时间】:2018-08-26 07:43:19
【问题描述】:

我有这个 SCNScene,它非常好,并且包含一些 nSCNNodes... 现在我想在 ARSCNView 中显示这个场景。但是,我的整个场景都是用 x,y,z >= 0 构建的,如果我只是设置屏幕,我的整个场景就会在相机后面。

在我拥有 currentFrame 之后,我也无法在视图中渲染我的场景,因为节点太多并且卡住了...

所以: 我正在寻找一种方法来以某种方式改变我的 SCNScene,这样它就不会改变自己,而是在相机前面找到一个合适的位置(即 0,0,0),并且可能会缩小一点。

这可能吗?如果是这样,我必须对哪些对象进行哪些转换?

感谢阅读:)

【问题讨论】:

    标签: arkit scnscene arscnview arcamera transformation-matrix


    【解决方案1】:

    假设我对你的解释正确,你想做两件事:

    • 加载您的场景,
    • 确保将其缩放到合理的大小。

    在问题的第一部分中,您说您无法加载模型,因为节点太多。由于您尚未发布任何代码,因此很难提供具体的解决方案,但这可能会有所帮助。

    (a) 在您的 SCNScene 中创建一个 EmptyNode 并将其命名为 'Root' 等,然后将您的所有实际场景元素设为该子项,例如:

    由于我们现在有一个保存场景的“根”节点,我们可以简单地执行以下操作来加载它:

      func loadScene(){
    
        //1. Get The Name Of The SCNSceme
        guard let hugeScene = SCNScene(named: "SceneKitAssets.scnassets/HugeScene.scn"),
               //2. Get The Root Node Which Holds All Your Content
               let sceneNode = hugeScene.rootNode.childNode(withName: "Root", recursively: false) else { return }
    
        //3. Add It To Your ARSCNView
        self.augmentedRealityView?.scene.rootNode.addChildNode(sceneNode)
    
        //4. Set The Scenes Position 1.5m Away From The Camera
         sceneNode.position =  SCNVector3(0, 0, -1.5)
    
        //5. Scale It To A Reasonable Size
        sceneNode.scale = SCNVector3(0.2,0.2,0.2)
    }
    

    您还可以查看在后台线程上加载它,例如:

     DispatchQueue.global(qos: .background).async {
            self.loadScene()
     }
    

    您需要尝试规模等,但这应该可以帮助您入门。

    【讨论】:

    • 相同的方法.. 但我场景中的“rootNode”不正是这样吗?那么我可以直接使用它还是必须先创建一个?
    • 既然您没有发布任何代码或提供场景图,我怎么知道? ^_____*
    • 是的,下次我会考虑的 ^^ 我只是说默认的“rootNode”,我也用它来添加我的所有子节点....我可以缩放那个吗?还是我应该创建一个新的自定义节点? :D
    • 如果您的 SCNScene 中有一个根节点,它包含所有其他节点,那么您可以使用:sceneNode.scale = SCNVector3(0.2,0.2,0.2) 等 ^^。
    猜你喜欢
    • 2019-06-19
    • 2018-07-19
    • 1970-01-01
    • 2017-08-04
    • 2014-12-13
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多