鎖をじゃらじゃらする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](0…30).map { i in shape }
for i in 0…30 {
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 0…10 {
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()
}
}
}
}
}