
的を倒してABCをゲットするiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SceneKit
class ViewController: UIViewController {
weak var sceneView : SCNView?
weak var slider : UISlider?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor(hue: 0.7, saturation: 0.2, brightness: 1, alpha: 1)
self.setupScene()
self.createPaper()
self.createShooter()
self.createCamera()
self.createSlider()
self.createLight()
}
func setupScene() {
let w = CGRectGetMaxX(self.view.bounds)
let sv = SCNView(frame: CGRect(x: 0, y: 0, width: w, height: w))
sv.backgroundColor = UIColor(hue: 0.7, saturation: 0.1, brightness: 1, alpha: 1)
sv.scene = SCNScene()
self.view.addSubview(sv)
self.sceneView = sv
}
func createPaper() {
let board = SCNBox(width: 40, height: 0.5, length: 20, chamferRadius: 0)
board.firstMaterial?.diffuse.contents = UIColor(hue: 0.7, saturation: 0.7, brightness: 1, alpha: 1)
let boardNode = SCNNode(geometry: board)
boardNode.physicsBody = SCNPhysicsBody.staticBody()
self.sceneView?.scene?.rootNode.addChildNode(boardNode)
for i in 0..<3 {
let paper = SCNBox(width: 8, height: 8, length: 1, chamferRadius: 0)
paper.firstMaterial?.diffuse.contents = UIColor(hue: 0.6, saturation: 0.5, brightness: 1, alpha: 1)
let paperNode = SCNNode(geometry: paper)
paperNode.position = SCNVector3(x: –12 + 12 * Float(i), y: 5, z: 4.5)
paperNode.physicsBody = SCNPhysicsBody.dynamicBody()
paperNode.physicsBody?.angularVelocityFactor = SCNVector3(x: 1, y: 0, z: 0)
paperNode.physicsBody?.velocityFactor = SCNVector3(x: 0, y: 1, z: 0)
self.sceneView?.scene?.rootNode.addChildNode(paperNode)
let word = SCNText(string: [“A”,”B”,“C”][i], extrusionDepth: 1)
word.font = UIFont.systemFontOfSize(6)
word.firstMaterial?.diffuse.contents = UIColor(hue: 0.5 + CGFloat(i) * 0.1, saturation: 0.9, brightness: 1, alpha: 1)
let wordNode = SCNNode(geometry: word)
wordNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: Float(M_PI)/2.0)
wordNode.position = SCNVector3(x: –2, y: –3, z: 2)
paperNode.addChildNode(wordNode)
}
}
func createShooter() {
let shooter = SCNCylinder(radius: 0.2, height: 2)
shooter.firstMaterial?.diffuse.contents = UIColor(hue: 0.25, saturation: 0.6, brightness: 1, alpha: 1)
let shooterNode = SCNNode(geometry: shooter)
shooterNode.name = “shooter”
self.sceneView?.scene?.rootNode.addChildNode(shooterNode)
self.shooterRotate(0)
}
func shooterRotate(angle :Float) {
if let shooterNode = self.sceneView?.scene?.rootNode.childNodeWithName(“shooter”, recursively: false) {
shooterNode.transform = SCNMatrix4Identity
shooterNode.pivot = SCNMatrix4MakeTranslation(0, –0.5, 0)
shooterNode.transform = SCNMatrix4Rotate(shooterNode.transform, –0.8, 1, 0, 0)
shooterNode.transform = SCNMatrix4Rotate(shooterNode.transform, angle, 0, 1, 0)
shooterNode.transform = SCNMatrix4Translate(shooterNode.transform, 0, 0, 40)
}
}
func createCamera() {
let camera = SCNNode()
camera.camera = SCNCamera()
camera.position = SCNVector3(x: 0, y: 0, z: 50)
self.sceneView?.scene?.rootNode.addChildNode(camera)
}
func createLight() {
let light = SCNLight()
light.type = SCNLightTypeOmni
let lightNode = SCNNode()
lightNode.light = light
lightNode.position = SCNVector3(x: 0, y: 10, z: 50)
self.sceneView?.scene?.rootNode.addChildNode(lightNode)
}
func createSlider() {
let s = UISlider()
s.center = CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds) + 50)
s.minimumValue = –Float(M_PI)/2.0;
s.maximumValue = Float(M_PI)/2.0;
self.view.addSubview(s)
s.addTarget(self, action: Selector(“slide:”), forControlEvents: .ValueChanged)
self.slider = s
}
func slide(slider : UISlider) {
self.shooterRotate(slider.value)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if let shooterNode = self.sceneView?.scene?.rootNode.childNodeWithName(“shooter”, recursively: false) {
let ball = SCNSphere(radius: 0.3)
ball.firstMaterial?.diffuse.contents = UIColor(hue: 0, saturation: 0, brightness: 0.2, alpha: 1)
let ballNode = SCNNode(geometry: ball)
ballNode.position = shooterNode.position
ballNode.physicsBody = SCNPhysicsBody.dynamicBody()
let a = Float(self.slider!.value) + Float(M_PI)/2.0
let x = 20 * cos(a)
let z = –20 * sin(a)
ballNode.physicsBody?.applyForce(SCNVector3(x: x, y: 14, z: z), impulse: true)
self.sceneView?.scene?.rootNode.addChildNode(ballNode)
}
}
}