Apple Engine

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

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

今回は Scene Editor の Physics Inspector (Command + Option + 6) 部分の Settings のところを見てゆく。

このパラメーターは物理シミュレーション時にジオメトリがどのような特性を持っているか設定する。

次回に説明する Velocity を含め、設定するパラメーターは少ないが、
他の PhysicsBody や PhysicsField の影響があるため、細かな数値設定をする必要がある。

 

Settings

以下のパラメーターがあり、Static は物理シミュレーションの影響を受けないため質量(Mass)の項目はない。

f:id:x67x6fx74x6f:20170815184356p:plain

  • Mass (Dynamic, Kinematic のみ)
  • Friction
  • Restitution
  • Rolling friction
  • Damping
  • Angular damping
  • Charge
  • Gravity: Affected by gravity
  • Resting: Allows resting

 

Mass

質量を表す。

デフォルト値は 1 で、1kg という設定。
0 にすると静止する。

例えば、他の Dynamic の PhysicsBody が同じ速度でぶつかった場合、質量が高いものの方が跳ね返す力が強くなる。

 

Friction

設置面の荒さによって抵抗を設定する摩擦の値。 デフォルト値は 0.5。

対象の PhysicsBody の Friction も 0 の場合は摩擦抵抗がなくなり滑り続け、互いが 1.0 の場合は全く滑らなくなる。

 

Restitution

他の PhysicsBody と衝突する際に運動エネルギーをそれだけ失うか、またはどれだけ運動エネルギーを得るかを設定する。

デフォルト値は 0.5。

1以上にすると衝突の際に力が発生するため、物体が弾む。
そのため、SCNFloor を Static な PhysicsBody で設定し、Dynamic の SCNSphere を上から落とした際、 デフォルトではそのまま床に張り付くが、Restitution を 1 以上にすると SCNSphere が弾む。

 

Rolling friction

回転運動に対する摩擦による抵抗力。

デフォルト値は 0。

設置面の床と回転して落ちる球の Rolling friction の値を大きくすると、 設置時に回転せずに止まるようになる。

 

Damping

流体摩擦、または空気の摩擦抵抗の影響をシミュレートする。

デフォルト値は 0.1。

0.5 にすると空間での抵抗を受けゆっくり落ち、1.0 にすると静止する。

 

Angular damping

Damping は移動に対してであったが、こちらは回転に関してのパラメーター。

デフォルト値は 0.1。

0.5 にすると空間での抵抗を受けゆっくり回転し、1.0 にすると全く回転はしない。

 

Charge

PhysicsBody が持つ電荷を設定する。
SCNPhysicsField の Electric Field、または Magnetic Field などの磁力に関係する外圧を使用する際に影響を受け、負の値はマイナス、正の値はプラスとなる。

デフォルト値は 0.0 で電場や磁場の影響を受けない。

 

Gravity

Affected by gravity のチェックを入れると PhysicsWorld で設定されている重力の影響を受ける。
そのため Dynamic の PhysicsBody でチェックを外すと重力の影響を受けないため静止する。

デフォルト値はオン(true)。

 

Resting

isResting というプロパティが存在しており、 力の影響を受けていない場合、SceneKit の物理シミュレーションによって自動的に true に設定され停止状態になる。

Allows resting のチェックをオンにすることで自動的に isResting を false に戻してシミュレーションさせるか否かを決める。

デフォルト値はオン(true)。

 

コード

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

ballNode.physicsBody?.mass = 1.0
ballNode.physicsBody?.friction = 0.5
ballNode.physicsBody?.restitution = 0.5
ballNode.physicsBody?.rollingFriction = 0.0
ballNode.physicsBody?.damping = 0.1
ballNode.physicsBody?.angularDamping = 0.1
ballNode.physicsBody?.charge = 0.0
ballNode.physicsBody?.isAffectedByGravity = true
ballNode.physicsBody?.allowsResting = true

scene.rootNode.addChildNode(ballNode)

 

今回はここまで。