Apple Engine

Apple, iPhone, iOS, その周辺のことについて

iOS で SceneKit を試す(Swift 3) その9 - 物理アニメーションを試す

Unity などと同様に、SceneKit も物理アニメーションが行われるオブジェクトを設定し、物理アニメーションの影響を受けるが画面内に固定されたものを設定するだけ。

f:id:x67x6fx74x6f:20170605193752g:plain

 

落下物を設定

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)

 

今回はここまで。