iPhone鎖

鎖をじゃらじゃらするiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController {

    weak var sceneView : SCNView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createChain()

    }

    func setupScene() {

        let sv = SCNView(frame: view.bounds)

        sv.backgroundColor = UIColor.blackColor()

        sv.scene = SCNScene()

        sv.allowsCameraControl = true

        sv.autoenablesDefaultLighting = true

        view.addSubview(sv)

        sceneView = sv

    }

    

    func createChain() {

        

        let shape = SCNPhysicsShape(geometry: SCNSphere(radius: 0.1), options: nil)

        let ringShape = { () -> SCNPhysicsShape in

            let dw = M_PI / 15.0

            let r = 1.0

            var transforms = [AnyObject]()

            var shapes = [Int](030).map { i in shape }

            for i in 030 {

                var t = SCNMatrix4Identity

                t = SCNMatrix4Translate(t, Float(r), 0, 0)

                t = SCNMatrix4Rotate(t, Float(dw) * Float(i), 0, 1, 0)

                transforms.append(NSValue(SCNMatrix4:t))

            }

            return SCNPhysicsShape(shapes: shapes, transforms: transforms)

        }()

        

        for i in 010 {

            let t = SCNTorus(ringRadius: 1, pipeRadius: 0.1)

            t.firstMaterial?.diffuse.contents = UIColor.lightGrayColor()

            let tNode = SCNNode(geometry: t)

            tNode.name = “chain”

            tNode.position = SCNVector3(x: Float(i) * 1.2, y: 0, z: 0)

            if i % 2 == 0 {

                tNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: Float(M_PI) / 2.0)

            }

            self.sceneView?.scene?.rootNode.addChildNode(tNode)

            

            if i==0 || i==10 {

                tNode.physicsBody = SCNPhysicsBody.staticBody()

            } else {

                tNode.physicsBody = SCNPhysicsBody.dynamicBody()

            }

            tNode.physicsBody?.physicsShape = ringShape

        }

    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

        if let touch = touches.first as? UITouch {

            let p = touch.locationInView(self.sceneView)

            if let hit = sceneView?.hitTest(p, options: [SCNHitTestSortResultsKey : true])?.first as? SCNHitTestResult {

                if hit.node.name == “chain” {

                    hit.node.removeFromParentNode()

                }

            }

        }

    }

}