swift - 以编程方式更改 scn 对象的 Material

标签 swift xcode scenekit

在我的场景编辑器中,我有一个带有黄色纹理的立方体,其名称为立方体。

如何在代码中更改立方体的 Material ?

基本上我应该是这样的:

let scene = SCNScene(named: "art.scnassets/cubeScene.scn")!

var cube = scene.rootNode.childNodes(named:"cube")

cube.diffuse.contents = UIImage(named: "grid.png")

但这行不通。什么是正确的方法?

最佳答案

您问题中的代码由于三个原因无法编译:

  1. childNode(named:)应该是 childNode(withName:recursively:) .既有重命名的参数,也有缺失的参数。

  2. childNode(withName:recursively:) 返回的值是一个可选节点(SCNNode?)——因为可能没有具有该名称的节点。

  3. SCNNode 没有 diffuse属性(property)。一个节点可能有一个 geometry 一个几何体可能有一个 firstMaterial . SCNMaterial 具有漫射特性。

根据您的需要,最后一行可能如下所示:

cube?.geometry?.firstMaterial?.diffuse.contents = /* ... */

注意所有的问号:

  • cube 后面有个问号因为可能不存在具有该名称的节点。
  • geometry 后面有个问号因为并非每个节点都有几何图形。一些节点有灯或摄像头。一些节点只是节点层次结构的一部分。
  • firstMaterial 后面有个问号因为不是每个几何体都有 Material 。此外,一些几何元素有多个 materials .

关于swift - 以编程方式更改 scn 对象的 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716373/

相关文章:

objective-c - 使用 NSWorkspace 在浏览器中打开多个 URL

swift - 在模型 I/O 中,提供的库中缺少记录的 API。解决方法是什么?

swift - 使用 SceneKit (SCNView) 显示统计信息(Swift 4/iOS 11 beta)

iOS 应用程序文本看起来更大已通过使用启动屏幕修复

ios - 无法从 Alamofire 的 Swift 3 中的 Web 服务 PATCH API 调用获得响应

Swift - 将字典保存到 NSUserDefaults 时 macOS 程序卡住

ios - 当应用程序转到后台时,SwiftUI View 停止更新

iphone - xcode sqlite3 libsqlite.dylib

ios - 如何在 SceneKit Editor 中使模型的枢轴点居中

ios - NSLocationWhenInUseUsageDescription 警告,但我已经添加了它