
木を登ってくるくる降りてくるiPhoneアプリのサンプルコード
import UIKit
import SceneKit;
class ViewController: UIViewController, SCNSceneRendererDelegate {
weak var sceneView : SCNView?
var up = false
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createTree()
createMonkey()
}
func setupScene() {
let sv = SCNView(frame: view.bounds)
sv.delegate = self
sv.scene = SCNScene()
sv.backgroundColor = UIColor(hue: 0.2, saturation: 0.3, brightness: 1, alpha: 1)
view.addSubview(sv)
sceneView = sv
}
func createTree() {
let ground = SCNCylinder(radius: 5, height: 0.2)
ground.firstMaterial?.diffuse.contents = UIColor.brownColor()
let groundNode = SCNNode(geometry: ground)
groundNode.position = SCNVector3(x: 0, y: –10, z: 0)
sceneView?.scene?.rootNode.addChildNode(groundNode)
groundNode.physicsBody = SCNPhysicsBody.staticBody()
let trunk = SCNCylinder(radius: 0.5, height: 20)
trunk.firstMaterial?.diffuse.contents = UIColor.brownColor()
let trunkNode = SCNNode(geometry: trunk)
sceneView?.scene?.rootNode.addChildNode(trunkNode)
let green = SCNSphere(radius: 5)
green.firstMaterial?.diffuse.contents = UIColor.greenColor()
let greenNode = SCNNode(geometry: green)
greenNode.position = SCNVector3(x: 0, y: 10, z: 0)
greenNode.transform = SCNMatrix4Scale(greenNode.transform, 1, 0.8, 1)
self.sceneView?.scene?.rootNode.addChildNode(greenNode)
}
func createMonkey() {
let monkey = SCNNode()
monkey.name = “monkey”
sceneView?.scene?.rootNode.addChildNode(monkey)
let color = UIColor(hue: 0.1, saturation: 0.4, brightness: 0.7, alpha: 1)
let head = SCNSphere(radius: 1)
head.firstMaterial?.diffuse.contents = color
let headNode = SCNNode(geometry: head)
headNode.position = SCNVector3(x: 0, y: 2, z: 0)
monkey.addChildNode(headNode)
let body = SCNCylinder(radius: 0.8, height: 2)
body.firstMaterial?.diffuse.contents = color
let bodyNode = SCNNode(geometry: body)
monkey.addChildNode(bodyNode)
[Int](0…1).each {i in
let bar = SCNBox(width: 2, height: 0.3, length: 0.3, chamferRadius: 0.05)
bar.firstMaterial?.diffuse.contents = color
let barNode = SCNNode(geometry: bar)
barNode.position = SCNVector3(x: 1, y: 1 – 2 * Float(i), z: 0)
monkey.addChildNode(barNode)
}
monkey.physicsBody = SCNPhysicsBody.dynamicBody()
monkey.physicsBody?.velocityFactor = SCNVector3(x: 0, y: 1, z: 0)
monkey.physicsBody?.angularVelocityFactor = SCNVector3(x: 0, y: 1, z: 0)
monkey.pivot = SCNMatrix4MakeTranslation(2, 0, 0)
monkey.position = SCNVector3Make(2, 0, 0)
}
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
if up {
let monkey = sceneView?.scene?.rootNode.childNodeWithName(“monkey”, recursively: false)
monkey?.physicsBody?.applyForce(SCNVector3(x: 0, y: 20, z: 0), impulse: false)
}
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
up = true
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
up = false
let monkey = sceneView?.scene?.rootNode.childNodeWithName(“monkey”, recursively: false)
monkey?.physicsBody?.applyTorque(SCNVector4Make(0, 1, 0, 5), impulse: true)
}
}
extension Array {
func each(doit:T -> Void) { for i in self { doit(i) } }
}