Apple Engine

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

iOS で SceneKit を試す(Swift 3) その69 - PhysicsBody の振る舞い 3

コードでしか変更できない物理シミュレーション設定についてのご紹介。

 

momentOfInertia、usesDefaultMomentOfInertia

PhysicsBody の慣性モーメントを変更する。

SceneKit では形状と質量に合わせて自動設定されるが usesDefaultMomentOfInertia を false にして、 momentOfInertia を設定すると独自の慣性モーメントを付加できる。

例えば、X 軸回転方向に制限をかける

let ball = SCNSphere(radius: 1)
let ballNode = SCNNode(geometry: ball)
ballNode.position.y = 10
ballNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)

ballNode.physicsBody?.usesDefaultMomentOfInertia = false
ballNode.physicsBody?.momentOfInertia = SCNVector3(0, 1, 1)

scene.rootNode.addChildNode(ballNode)

 

力、トルク、衝動(力積、インパルス)

3つのメソッドとそれらをキャンセルするメソッドがある。

ユーザー操作で PhysicsBody を動かす場合はこちらを使うことになる。

  • applyForce(SCNVector3, asImpulse: Bool)
  • applyForce(SCNVector3, at: SCNVector3, asImpulse: Bool)
  • applyTorque(SCNVector4, asImpulse: Bool)

 

説明

applyForce の2つは移動の力となり、applyTorque は回転であるトルクの力が現在与えられている力に加わる。

1つ目の applyForce はジオメトリの重心から力を与え、
2つ目の applyForce の at はノードのローカル座標の場所から力を与える。

asImpulse を true にすると運動量の瞬間的な変化が適用され、false にすると最初のアニメーションループ(動作1フレーム目)にのみ適応されている模様。

 

単位

  • Force の単位はニュートン
  • Torque の単位はニュートンメートル

 

asImpulse が true の場合は

  • Force の単位はニュートン秒
  • Torque の単位はニュートンメートル秒

 

コード

node.physicsBody?.applyForce(SCNVector3(1,0,0), asImpulse: true)
node.physicsBody?.applyForce(SCNVector3(1,0,0), at: SCNVector3(0,0,0), asImpulse: true)
node.physicsBody?.applyTorque(SCNVector4(0,0,-1,1), asImpulse: true)

// Force や Torque のキャンセル
node.physicsBody?.clearAllForces()

 

重力や空気抵抗、他の PhysicsBody の摩擦や衝突などによる力の減衰、PhysicsField の影響があるため、実際に動かしてみないと動作の把握が難しい感じはある。

 

今回はここまで。