SCNBox在每个脸上都有不同的颜色或纹理

我是iOS开发的新手,我已经陷入了困境。 我正在尝试使用每个人脸颜色不同的SceneKit渲染一个多维数据集。

这是我到目前为止:

func sceneSetup() { // 1 let scene = SCNScene() // 2 let BoxGeometry = SCNBox(width: 0.9, height: 0.9, length: 0.9, chamferRadius: 0.0) BoxGeometry.firstMaterial?.diffuse.contents = UIColor.redColor() let cube = SCNNode(geometry: BoxGeometry) cube.position = SCNVector3(x: 0, y: 0, z: -1) scene.rootNode.addChildNode(cube) // 3 sceneView.scene = scene sceneView.autoenablesDefaultLighting = true sceneView.allowsCameraControl = true 

但我希望每张脸都有不同的颜色。 我怎么做?

盒子由六个不同的元素组成(每边一个)。 您可能还注意到,几何对象对于第一个材质具有一个属性,但对于一组材质也是一个属性。

具有多个元素和多个材质的对象将为每个元素选取材质(和包裹)的增量。

例如4个元素和1个材质

 Element 1 2 3 4 Material 1 1 1 1 

或4元素和2材料

 Element 1 2 3 4 Material 1 2 1 2 // note that they are repeating 

例如4个元素和7个材质

 Element 1 2 3 4 Material 1 2 3 4 // (5, 6, 7) is unused 

在盒子的情况下,这意味着您可以使用六种材料的arrays在盒子的每一侧都有独特的材料。 在我的Scene Kit书籍(在Objective-C中) 的章节之一的示例代码中有一个例子:

 // Each side of the box has its own color // -------------------------------------- // All have the same diffuse and ambient colors to show the // effect of the ambient light, even with these materials. SCNMaterial *greenMaterial = [SCNMaterial material]; greenMaterial.diffuse.contents = [NSColor greenColor]; greenMaterial.locksAmbientWithDiffuse = YES; SCNMaterial *redMaterial = [SCNMaterial material]; redMaterial.diffuse.contents = [NSColor redColor]; redMaterial.locksAmbientWithDiffuse = YES; SCNMaterial *blueMaterial = [SCNMaterial material]; blueMaterial.diffuse.contents = [NSColor blueColor]; blueMaterial.locksAmbientWithDiffuse = YES; SCNMaterial *yellowMaterial = [SCNMaterial material]; yellowMaterial.diffuse.contents = [NSColor yellowColor]; yellowMaterial.locksAmbientWithDiffuse = YES; SCNMaterial *purpleMaterial = [SCNMaterial material]; purpleMaterial.diffuse.contents = [NSColor purpleColor]; purpleMaterial.locksAmbientWithDiffuse = YES; SCNMaterial *magentaMaterial = [SCNMaterial material]; magentaMaterial.diffuse.contents = [NSColor magentaColor]; magentaMaterial.locksAmbientWithDiffuse = YES; box.materials = @[greenMaterial, redMaterial, blueMaterial, yellowMaterial, purpleMaterial, magentaMaterial]; 

泰国你的快速帮助。 我用你构成的代码,但无法使用NSColor,所以我尝试了色彩,但我所得到的是一个黑色的立方体,所以我试过这个,我得到它的工作

  let BoxGeometry = SCNBox(width: 0.95, height: 0.95, length: 0.95, chamferRadius: 0.0) let greenMaterial = SCNMaterial() greenMaterial.diffuse.contents = UIImage(named: "g") greenMaterial.locksAmbientWithDiffuse = true; let redMaterial = SCNMaterial() redMaterial.diffuse.contents = UIImage(named: "r") redMaterial.locksAmbientWithDiffuse = true; let blueMaterial = SCNMaterial() blueMaterial.diffuse.contents = UIImage(named: "b") blueMaterial.locksAmbientWithDiffuse = true; let yellowMaterial = SCNMaterial() yellowMaterial.diffuse.contents = UIImage(named: "y") yellowMaterial.locksAmbientWithDiffuse = true; let purpleMaterial = SCNMaterial() purpleMaterial.diffuse.contents = UIImage(named: "p") purpleMaterial.locksAmbientWithDiffuse = true; let WhiteMaterial = SCNMaterial() WhiteMaterial.diffuse.contents = UIImage(named: "w") WhiteMaterial.locksAmbientWithDiffuse = true; BoxGeometry.materials = [greenMaterial, redMaterial, blueMaterial, yellowMaterial, purpleMaterial, WhiteMaterial]; 

g是一个绿色的jpeg等,现在已经开始工作了。

这是一个Swift 4的答案。

  let colors = [UIColor.green, // front UIColor.red, // right UIColor.blue, // back UIColor.yellow, // left UIColor.purple, // top UIColor.gray] // bottom let sideMaterials = colors.map { color -> SCNMaterial in let material = SCNMaterial() material.diffuse.contents = color material.locksAmbientWithDiffuse = true return material } materials = sideMaterials 

要改变前面的材料,只需抓住材料,并改变它的内容

 let frontMaterial = materials[0] frontMaterial.diffuse.contents = UIColor.white