
何かが4枚のブレードを回して垂直に上昇するiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SceneKit
class ViewController: UIViewController, SCNSceneRendererDelegate {
weak var sceneView : SCNView?
var up = false
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createBoard()
createCopter()
}
func setupScene() {
let sv = SCNView(frame: view.bounds)
sv.scene = SCNScene()
sv.backgroundColor = UIColor(hue: 0.15, saturation: 0.1, brightness: 1, alpha: 1)
sv.allowsCameraControl = true
sv.autoenablesDefaultLighting = true
sv.delegate = self
view.addSubview(sv)
sceneView = sv
}
func createBoard() {
let board = SCNBox(width: 5, height: 0.2, length: 5, chamferRadius: 0)
board.firstMaterial?.diffuse.contents = UIColor.brownColor()
let boardNode = SCNNode(geometry: board)
sceneView?.scene?.rootNode.addChildNode(boardNode)
boardNode.physicsBody = SCNPhysicsBody.staticBody()
}
func createCopter() {
let copter = SCNNode()
copter.name = “copter”
copter.position = SCNVector3(x: 0, y: 1, z: 0)
sceneView?.scene?.rootNode.addChildNode(copter)
// body
let bar = SCNBox(width: 2, height: 0.2, length: 0.2, chamferRadius: 0)
bar.firstMaterial?.diffuse.contents = UIColor(white: 0.5, alpha: 1)
for i in 0…1 {
let barNode = SCNNode(geometry: bar)
if (i==0) { barNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: Float(M_PI) * 0.5) }
copter.addChildNode(barNode)
}
// roter
for j in 0…3 {
let x = 0.9 * cos(Double(M_PI * 0.5) * Double(j))
let z = 0.9 * sin(Double(M_PI * 0.5) * Double(j))
let roater = SCNNode()
roater.name = “roater”
roater.position = SCNVector3(x: Float(x), y: 0.3, z: Float(z))
copter.addChildNode(roater)
let cylinder = SCNCylinder(radius: 0.03, height: 0.3)
cylinder.firstMaterial?.diffuse.contents = UIColor(white: 0.8, alpha: 1)
let cylinderNode = SCNNode(geometry: cylinder)
cylinderNode.position = SCNVector3(x: 0, y: –0.1, z: 0)
roater.addChildNode(cylinderNode)
for i in 0…1 {
let blade = SCNBox(width: 0.8, height: 0.05, length: 0.1, chamferRadius: 0.05)
blade.firstMaterial?.diffuse.contents = UIColor(white: 0.1, alpha: 0.9)
let bladeNode = SCNNode(geometry: blade)
if (i==0) {bladeNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: Float(M_PI) * 0.5)}
roater.addChildNode(bladeNode)
}
}
copter.physicsBody = SCNPhysicsBody.dynamicBody()
copter.physicsBody?.damping = 0.99
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.up = !self.up
sceneView?.playing = true
}
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
if let copter = sceneView?.scene?.rootNode.childNodeWithName(“copter”, recursively: false) {
copter.childNodes
.filter {($0 as! SCNNode).name == “roater”}
.map { n -> Void in
if (!self.up) {
(n as! SCNNode).removeAllActions()
} else {
(n as! SCNNode).runAction(SCNAction.rotateByAngle(CGFloat(M_PI) * 0.1, aroundAxis: SCNVector3(x: 0, y: 1, z: 0), duration: 0.0001))
copter.physicsBody?.applyForce(SCNVector3(x: 0, y: 5, z: 0), impulse: false)
}
}
}
}
}