代码之家  ›  专栏  ›  技术社区  ›  yuta

无法使用ARKit和SceneKit更改scn文件(材质/漫反射.contens)的颜色

  •  2
  • yuta  · 技术社区  · 6 年前

    我刚刚做了一个项目:Xcode:File>新建(>);项目(>);增强现实应用程序。

    我想改变船的颜色。scn变为黄色,但什么也没发生。我怎样才能改变船的颜色。scn??

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.showsStatistics = true
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
    
        // here, trying to change the color of the ship.scn
        scene.rootNode.geometry?.materials.first?.diffuse.contents = UIColor.yellow
        sceneView.scene = scene
    }
    

    我尝试了breakpoint和po命令来检查rootNode包含什么。

    (lldb) po scene.rootNode.childNodes
    ▿ 1 element
      - 0 : <SCNNode: 0x1c01f8d00 'ship' | 1 child>
    
    (lldb) po scene.rootNode.childNodes.first?.name
    ▿ Optional<String>
      - some : "ship"
    
    (lldb) po scene.rootNode.childNodes.first?.geometry
    nil
    

    为什么几何体为零??我能看到彩色的船。

    1 回复  |  直到 6 年前
        1
  •  1
  •   rickster    6 年前

    欢迎使用堆栈溢出!是时候来点Swift 101了。。。此行包含 optional chaining :

    scene.rootNode.geometry?.materials.first?.diffuse.contents = UIColor.yellow
    

    每当您看到一系列涉及 问号 ,结果是。。。 可疑的 . 在这种情况下,如果 rootNode.geometry 为零,发生后没有任何呼叫。

    那么,如何解决这个问题呢?通常,在运行时检查场景,以确保您认为拥有的节点层次是您实际获得的。使用调试器或一些打印语句找出 rootNode 实际上包含、其子节点是什么、这些节点包含什么等等,或者查看您在Xcode场景编辑器中拥有的资源,并交叉引用这些资源以确定要使用哪些节点 search for by name .

    在您使用的Xcode项目模板中,船舶几何体不在场景的根节点上。。。在进入之前,有两层节点层次结构。找到正确的节点后,设置 diffuse.contents 在其第一个材质上,将使用您的颜色替换纹理贴图。