iOS で SceneKit を試す(Swift 3) その9 - 物理アニメーションを試す
Unity などと同様に、SceneKit も物理アニメーションが行われるオブジェクトを設定し、物理アニメーションの影響を受けるが画面内に固定されたものを設定するだけ。
落下物を設定
GameScene.swift の func setUpScene() の中に
以下のコードを書くと球 Y 軸 2 に球が置かれて下に落ちる。
ノードの physicsBody に SCNPhysicsBody の type を dynamic へ設定すると アニメーション設定を行わなくても球が落ちてゆく。
let ball = SCNSphere(radius: 2) let ballNode = SCNNode(geometry: ball) ballNode.position.y = 2 ballNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil) self.rootNode.addChildNode(ballNode)
そのままだと、下に落ち続けるため球を受け止める床を設定する。
床をを設定
SCNFloor を使って床を先ほどの球の下にコードを書く。
SCNPhysicsBody のタイプが dynamic だと、球と共に落ちてしまうので static に設定。
static にすることで物理判定はあるが、重力の影響を受けず画面に固定されるようになる。
static は動かないものに対して設定する。
let floor = SCNFloor() let floorNode = SCNNode(geometry: floor) floorNode.position = SCNVector3(0, -4, 0) floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil) self.rootNode.addChildNode(floorNode)
画面タップしてボールを配置する
まず、ballNode を消して床だけにする。
タッチイベントの設定は ViewController.swift の方で行なっているので、
ViewController.swift を開き、func handleTap の中を変更していく。
行うことは簡単で SCNView を呼び出しシーンに球を追加するだけ。 以下のサンプルを書きビルド。画面をタップすると球がシーン状に追加される。
let scnView = self.view as! SCNView let ball = SCNSphere(radius: 0.5) let ballNode = SCNNode(geometry: ball) ballNode.position.y = 2 ballNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil) scnView.scene?.rootNode.addChildNode(ballNode)
当たり判定が球を囲んだ四角になってしまっているので、
以下に書き直し、ノードのオブジェクトの形に判定を合わせる。
let scnView = self.view as! SCNView let ball = SCNSphere(radius: 0.5) let ballNode = SCNNode(geometry: ball) ballNode.position.y = 2 // 追加分 let physicsBall = SCNPhysicsShape(node: ballNode, options: nil) ballNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: physicsBall) scnView.scene?.rootNode.addChildNode(ballNode)
今回はここまで。