Вам нужно создать одну геометрию, один узел коробки, а затем copy, что boxNode. Вы используете клон, когда у вас есть узел с дочерними элементами и flattenedClone, когда вы хотите объединить геометрию/материалы всего поддерева в узле. В вашем случае копии должны быть достаточно. Просто измените положение вашего скопированного узла.
GameScene
import Foundation
import SceneKit
class GameScene: SCNScene {
override init() {
super.init()
let geometry = SCNBox(width: 0.6 , height: 0.6,
length: 0.1, chamferRadius: 0.005)
geometry.firstMaterial?.diffuse.contents = UIColor.red
geometry.firstMaterial?.specular.contents = UIColor.white
geometry.firstMaterial?.emission.contents = UIColor.blue
let boxnode = SCNNode(geometry: geometry)
let offset: Int = 16
for xIndex:Int in 0...32 {
for yIndex:Int in 0...32 {
let boxCopy = boxnode.copy() as! SCNNode
boxCopy.position.x = Float(xIndex - offset)
boxCopy.position.y = Float(yIndex - offset)
self.rootNode.addChildNode(boxCopy)
}
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
В контроллере представления, viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
// create a new scene
let scene = GameScene()
// retrieve the SCNView
let scnView = self.view as! SCNView
// set the scene to the view
scnView.scene = scene
scnView.pointOfView?.position = SCNVector3Make(0, 0, 100)
// allows the user to manipulate the camera
scnView.allowsCameraControl = true
// show statistics such as fps and timing information
scnView.showsStatistics = true
// configure the view
scnView.backgroundColor = UIColor.white
}
Обратите внимание, что я просто нажал на точку зрения камеры обратно на оси + Z, чтобы иметь лучший вид вашей сетки.
Скриншот сетки
Edit: Новый материал для каждой геометрии
Если вы хотите назначить новый материал для каждой геометрии, вам нужно создать копию геометрии и присвоение нового материала этой копии геометрии. См. Приведенный ниже код, который произвольно присваивает UIImage для каждого диффузного свойства из набора из семи изображений с именем 1.png to 8.png.
import Foundation
import SceneKit
class GameScene: SCNScene {
override init() {
super.init()
let geometry = SCNBox(width: 6 , height: 6,
length: 6, chamferRadius: 0.5)
for xIndex:Int in stride(from: 0, to: 32, by:8) {
for yIndex:Int in stride(from: 0, to: 32, by: 8) {
// create a geometry copy
let geoCopy = geometry.copy() as! SCNGeometry
// create a random material
let r = arc4random_uniform(7) + 1
let img = UIImage(named: "\(r).png")
let mat = SCNMaterial()
mat.diffuse.contents = img
geoCopy.firstMaterial = mat
// create a copy node with new material and geo copy
let boxnode = SCNNode(geometry: geoCopy)
let boxCopy = boxnode.copy() as! SCNNode
boxCopy.position.x = Float(xIndex - offset)
boxCopy.position.y = Float(yIndex - offset)
self.rootNode.addChildNode(boxCopy)
}
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Скриншот
спасибо !! Но у меня есть последний вопрос. Я пытаюсь добавить SCNMaterial() для каждой геометрии, как я могу это сделать? Материал для каждого узла отличается, у меня всего 15 узлов. Благодарю. Я только что обновил свой вопрос. – John
@John Обновлен ответ, так что каждый узел имеет другой материал. –
Спасибо, очень оценили. Но как я могу сделать это с изображениями. Просто обновил свой ответ. – John