紙コップを飛ばすiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SceneKit;
class ViewController: UIViewController {
weak var sceneView : SCNView?
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createGround()
createPaperRocket()
createCamera()
}
func setupScene() {
let sv = SCNView(frame: view.bounds)
sv.scene = SCNScene()
sv.backgroundColor = UIColor(hue: 0.3, saturation: 0.1, brightness: 1.0, alpha: 1)
view.addSubview(sv)
sceneView = sv
}
func createGround() {
let ground = SCNBox(width: 20, height: 1, length: 10, chamferRadius: 0)
ground.firstMaterial?.diffuse.contents = UIColor(hue: 0.3, saturation: 0.4, brightness: 1, alpha: 1)
let groundNode = SCNNode(geometry: ground)
groundNode.physicsBody = SCNPhysicsBody.staticBody()
sceneView?.scene?.rootNode.addChildNode(groundNode)
}
func createPaperRocket() {
let cup = SCNNode()
cup.name = “cup”
cup.position = SCNVector3(x: –8, y: 1, z: 0)
self.sceneView?.scene?.rootNode.addChildNode(cup)
[Int](0…100).each {j in
let body = SCNTorus(ringRadius: 1 – CGFloat(j) * 0.004, pipeRadius: 0.02)
body.firstMaterial?.diffuse.contents = UIColor(hue: 0.5, saturation: 0.5, brightness: 1, alpha: 1)
body.firstMaterial?.lightingModelName = SCNLightingModelLambert
let bodyNode = SCNNode(geometry: body)
bodyNode.position = SCNVector3(x: 0, y: Float(j) * 0.02, z: 0)
cup.addChildNode(bodyNode)
}
cup.physicsBody = SCNPhysicsBody.dynamicBody()
}
func createCamera() {
let camera = SCNNode()
camera.camera = SCNCamera()
camera.position = SCNVector3Make(0, 10, 20)
camera.rotation = SCNVector4Make(1, 0, 0, –0.3)
sceneView?.scene?.rootNode.addChildNode(camera)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let cup = sceneView?.scene?.rootNode.childNodeWithName(“cup”, recursively: false)
cup?.physicsBody?.applyForce(SCNVector3(x: 6, y: 10, z: 0), atPosition: SCNVector3(x: –0.2, y: 0, z: 0), impulse: true)
}
}
extension Array {
func each(doit:T -> Void) { for i in self {doit(i)}}
}