Swift 如何以编程方式将材质指定给三维SCN节点?

Swift 如何以编程方式将材质指定给三维SCN节点?,swift,scenekit,arkit,scnnode,Swift,Scenekit,Arkit,Scnnode,我试图弄清楚如何通过编程将材质指定给ARKit场景中的某个对象(SCNNode)(XCode 9/Swift 4)。我试图以编程方式实现这一点,因为我希望同一形状的对象渲染时使用过多的变体(或用户生成的图像),无法通过场景中的菜单指定来实现。该对象只是一个立方体-目前,我只是试图让一侧显示从“资源”文件夹中提取的材质 这是我尝试引用以前堆栈帖子的当前代码,但对象仍然是白色的 let material = SCNMaterial() material.diffuse.contents = UIIm

我试图弄清楚如何通过编程将材质指定给ARKit场景中的某个对象(SCNNode)(XCode 9/Swift 4)。我试图以编程方式实现这一点,因为我希望同一形状的对象渲染时使用过多的变体(或用户生成的图像),无法通过场景中的菜单指定来实现。该对象只是一个立方体-目前,我只是试图让一侧显示从“资源”文件夹中提取的材质

这是我尝试引用以前堆栈帖子的当前代码,但对象仍然是白色的

let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "texture.jpg")

let nodeObject = self.lastUsedObject?.childNode(withName: "box", recursively: true)
// I believed this lets me grab the last thing I rendered in an ARKit scene - please
// correct me if I'm wrong.  My object is also labeled "box".
nodeObject?.geometry?.materials
nodeObject?.geometry?.materials[0] = material // I wanted to grab the first face of the box

提前非常感谢!我已经摆弄了一段时间,但我似乎无法掌握Swift中3D对象/场景的编程方法。

总的来说,我设置了这样一个对象的材质,它正在工作(只抓取盒子的一面)

var imageMaterial = SCNMaterial()
imageMaterial.isDoubleSided = false
imageMaterial.diffuse.contents = UIImage(named: "myImage")
var cube: SCNGeometry? = SCNBox(width: 1.0, height: 1.0, length: 1, chamferRadius: 0)
var node = SCNNode(geometry: cube)
node.geometry?.materials = [imageMaterial]

因此,可能是您无法抓取该对象,如注释中所述。

首先,将这些?更改为!并查看您的程序是否崩溃。如果崩溃,您知道您没有抓取您的盒子是的,当我将其更改为“!”时,它崩溃了。”-谢谢你的提醒。非常感谢-这很有效。对于其他尝试在ARKit中使用此方法的人,我建议以编程方式创建SCNNode,然后通过代码将其添加为virtualObject。它更易于调试和工作。如果对你有效,请不要忘了标记答案。很高兴我能够提供帮助:)