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 の影響があるため、実際に動かしてみないと動作の把握が難しい感じはある。
今回はここまで。