【问题标题】:How can I load multiple nodes of the same 3d model all at once?如何一次加载同一 3d 模型的多个节点?
【发布时间】:2018-08-16 23:50:31
【问题描述】:

我正在开发一个 ARKit 应用程序,您可以在其中穿过一个门户,然后您会在其他地方。我购买了一个拱门的 3d 模型作为门户。我将模型放入 Blender 以将其压平成一块,但纹理消失了,每当我应用新纹理时,它只会显示在模型的一部分上。

这是原始模型,仅通过将其更改为 .dae 格式进行了修改。但是,如果不一遍又一遍地写同一行,我就无法加载 arch1、arch2、arch3 等

使用这个模型,我会一遍又一遍地编写相同的代码

private func addPortalArch(hitResult: ARHitTestResult) {

            let portalScene = SCNScene(named: "art.scnassets/Medieval_portal.dae")
            let portalNode = portalScene?.rootNode.childNode(withName: "arch1", recursively: true) 

// 我会为每个拱门一遍又一遍地编写这个 portalNode = portalScene 行。

//据我所知,我还必须获取每个部分的位置,我不知道如何根据用户点击放置门户的位置开始这样做。

            portalNode?.position = SCNVector3(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)

            self.sceneView.scene.rootNode.addChildNode(portalNode!)

        }

我需要模型是一次性的,但在整个模型上仍然使用相同的石雕材料。

【问题讨论】:

标签: ios swift scenekit arkit


【解决方案1】:

查看您发送的文件,最好的办法是使用包含 Arch 各个方面的模型(您的第一张图片)。

第一步(并不总是必要但有用)是将dae 文件转换为.scn 文件:

完成此操作后,您需要创建一个 Empty Node 作为 Portal Door RootNode 并让 Portal 的每个元素成为该元素的子元素,例如:

您还需要将每个ChildNode(不是 PortalRoot)欧拉角 X 旋转 -90(因为当您加载模型时 Portal Door 位于其一侧):

现在,由于您有一个 RootNode,因此无需遍历所有节点以便显示在屏幕上。你可以简单地使用这样的函数:

  /// Places The Portal Door 5m Aeay From The Camera
func setupPortalDoor(){

    //1. Get The Portal Scene
    guard let portalScene = SCNScene(named: "portalDoor.scn"),
        //2. Get The Portal Node
        let portalModel = portalScene.rootNode.childNode(withName: "PortalRoot", recursively: false) else { return }

    //3. Add To The ARSCNView Root
    augmentedRealityView?.scene.rootNode.addChildNode(portalModel)

    //4. Position It 5m Away From The Camera
    portalModel.position = SCNVector3(0, 0, -5)

    /*
     The Portal Is Large So I Suggest Scaling It ^__________*
    */
}

如果您以后想将门户拱门更改为大理石,您可以轻松地这样做:

 for node in portalModel.childNodes{

        node.geometry?.firstMaterial?.diffuse.contents = UIColor.cyan
 }

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2017-03-31
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多