Scenekit:如何获取节点的所有材质?

Posted

技术标签:

【中文标题】Scenekit:如何获取节点的所有材质?【英文标题】:Scenekit: How to get all of node's materials? 【发布时间】:2018-03-12 11:55:28 【问题描述】:

好的,据我了解,可以在模型编辑器中为 .dae 或在 Xcode 中用作 SCNNode 的任何 3D 模型创建材料:

最上面的材料会自动应用,一切都很好。我的问题是我想以编程方式在整个游戏中创建的这些材料之间切换。

我试图通过以下方式获取这些材料的数组:

node.geometry?.materials

但是这只会返回第一个材料。我已经尝试了everybting,但无法找到获取其他材料并切换到它们的方法。现在我正在尝试:

childNode.geometry?.materials = [(childNode.geometry?.material(named: "test"))!]
//childNode is the node

其中 test 是第二种材料,但它发现它为零。如何以编程方式在多种材质之间切换?

【问题讨论】:

【参考方案1】:

如果材质实际上没有分配到材质槽之一(例如漫反射),它也不是几何体的一部分。

您可以将第二个材质分配给另一个插槽,然后在将材质读入属性后在代码中重置其颜色以供以后使用。

我自己使用的另一个选项是将多种材料分配给同一模型的不同面(在第三方 3d 软件中)。导出为 dae,添加到 xcode,然后自动将几何体划分为单独的元素,每个元素都有自己的材质。然后我可以在 xcode 中进行调整,并以与您尝试相同的方式进行迭代。

【讨论】:

谢谢。您能否更详细地解释如何执行第一个选项?另一个插槽是什么意思? 我的意思是作为一种解决方法,您可以将第二个纹理/颜色放入例如 Emission 属性中。然后在代码中,您可以读取 Emission 属性的 .contents 属性,将其保存在自定义属性中,然后将其分配给 Diffuse 插槽。请记住在阅读 Emission 插槽后将 Emission 重置回黑色。

以上是关于Scenekit:如何获取节点的所有材质?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SceneKit 中更改几何材质的颜色

如何使用 SceneKit 从 COLLADA (.dae) 文件中获取几何图形

从 Angular 6 材质树中的子节点获取父层次结构

SceneKit:增加用于 SCNNode 材质的纹理的清晰度?

物理计算scenekit后获取节点位置

SceneKit在旋转后获取节点位置