球を順番に点灯させるiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SceneKit
class ViewController: UIViewController {
weak var sceneView : SCNView?
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createCord()
createCamera()
}
func setupScene() {
let sv = SCNView(frame: view.bounds)
sv.scene = SCNScene()
sv.autoenablesDefaultLighting = true
sv.allowsCameraControl = true
sv.backgroundColor = UIColor.blackColor()
view.addSubview(sv)
sceneView = sv
}
func createCord() {
let count = 35
let angle = 2.0 * M_PI / Double(count)
let r = 10.0
[Int](0…count).each { i in
let l = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.5)
l.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 0.2, alpha: 1)
let lnode = SCNNode(geometry: l)
let x = r * cos(angle * Double(i))
let z = r * sin(angle * Double(i))
lnode.position = SCNVector3(x: Float(x), y: 20, z: Float(z))
lnode.name = “light \(i)“
self.sceneView?.scene?.rootNode.addChildNode(lnode)
if i % 6 == 0 {
// vertical
let cnt = 4 + i / 6;
[Int](0…cnt).each { j in
let vl = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.5)
vl.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 0.2, alpha: 1)
let vlnode = SCNNode(geometry: vl)
vlnode.name = “light \(i + j + 1)“
vlnode.position = SCNVector3(x: Float(x), y: 18 – Float(j) * 3, z: Float(z))
self.sceneView?.scene?.rootNode.addChildNode(vlnode)
}
}
}
}
func createCamera() {
let camera = SCNNode()
camera.camera = SCNCamera()
camera.position = SCNVector3(x: 0, y: 0, z: 60)
self.sceneView?.scene?.rootNode.addChildNode(camera)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.sceneView?.scene?.rootNode.childNodes
.filter { ($0 as SCNNode).name?.rangeOfString(“light”) != nil }
.map {light -> Void in
if let num = light.name!.componentsSeparatedByString(” “)[1].toInt() {
light.runAction(SCNAction.sequence([
SCNAction.waitForDuration(NSTimeInterval(num) * 0.1),
SCNAction.runBlock { n -> Void in
let nn = SCNNode() // dummy for compile error
n.geometry?.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 1, alpha: 1)
}
]))
}
}
}
}
extension Array {
func each(doit:(T)->Void) {for i in self {doit(i);}}
}