iPhoneくあっどこぷた

何かが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 01 {

            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 03 {

            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 01 {

                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)

                    }

                   

                }

        }

    }

}