Reference
https://developer.apple.com/documentation/scenekit/scnphysicsbody
宣言
class SCNPhysicsBody : NSObject
概要
SceneKitは、新しいフレームをレンダリングする準備をするときに、シーン内のノードに接続されている物理ボディに対して物理計算を実行します。これらの計算には、重力、摩擦、および他の物体との衝突が含まれます。ボディに自分の力や衝撃を加えることもできます。SceneKitはこれらの計算を完了すると、フレームをレンダリングする前にノードオブジェクトの位置と方向を更新します。
ノードに物理演算を追加するには、SCNPhysicsBodyオブジェクトを作成して構成し、それをSCNNode
オブジェクトのphysicsBody
プロパティに割り当てます。物理ボディは、力または衝撃をノードオブジェクトに適用する前に、ノードオブジェクトに関連付ける必要があります。
ボディの物理的特徴
このSCNPhysicsBodyクラスは、シーンによってシミュレートされるときのボディの物理的特性を定義します。物理シミュレーションでは、次の3つのプロパティが最も重要です。
type
プロパティ
シミュレーションにおいて、ボディが力や他のボディとどのように相互作用するかを決定します。Static ボディは力や衝突の影響を受けず、移動できません。Dynamic ボディは、力や他のボディタイプとの衝突の影響を受けます。Kinematic ボディは力や衝突の影響を受けませんが、それらを直接移動することで、ダイナミックボディに影響を与える衝突を引き起こす可能性があります。physicsShape
プロパティ
衝突検出のために体の三次元形状を定義する。ノードの表示可能なジオメトリの詳細ではなく単純な形状を使用すると、物理シミュレーションがより高速に実行されます。通常、ボディの物理形状を、ノードの表示コンテンツにほぼ一致する境界ボックス、球、またはプリミティブ形状に設定します。物理シェイプの作成の詳細については、SCNPhysicsShape
を参照してください。kinematic()
プロパティ。動的な物体に力またはトルクを加えると、その質量に比例した加速度(または角加速度)が発生します。
SceneKitの物理シミュレーションのすべての値は、国際単位系(SI)を使用します。質量の単位はキログラムです。力、力積、およびトルクの単位は、ニュートン、ニュートン秒、およびニュートンメートルです。ノードの位置とサイズの距離の単位はメートルです。物理量に現実的な値を提供しようとする必要はないことに注意してください。探している動作やゲームプレイを生み出す値を使用してください。
Dynamic ボディの場合、力または衝突によってボディがどのように影響を受けるかを制御できます。力Defining How Forces Affect a Physics Body を参照してください。
ボディのカテゴリと衝突の定義
物理学を使用するゲームを設計するときは、シーンに表示される物理学オブジェクトのさまざまなカテゴリを定義します。アプリに必要な動作に応じて、さまざまなカテゴリの物理ボディを定義します。ボディは、これらのカテゴリに必要な数だけ割り当てることができます。物理ボディは、独自のカテゴリを宣言するだけでなく、相互作用するボディのカテゴリも宣言します。
categoryBitMask
とcollisionBitMask
プロパティを使用して、オブジェクトの衝突動作を定義します。SCNPhysicsCollisionCategory
にリストされている定数は、これらのプロパティのデフォルト値を提供します。さらに、contactTestBitMask
プロパティを使用すると、ボディが衝突の影響を受けることなく、ボディのペアがコンタクトメッセージ(SCNPhysicsContactDelegate
プロトコルを参照)を生成するインタラクションを定義できます。
関連する物理学のクラス
物理学の分野は、渦や重力の引力など、領域内のすべての物体に影響を与える力を生み出します。詳細および使用可能なフィールドタイプのリストについては、SCNPhysicsField
を参照してください。
関節や車輪付き車両など、複数のボディ間の相互作用を制御する高レベルの動作を追加できます。詳細および使用可能な動作のリストについては、SCNPhysicsBehavior
を参照してください。
シーンのphysicsWorld
プロパティは、シーン全体に影響を与える物理特性を管理するSCNPhysicsWorld
オブジェクトを保持します。
物理学とレンダリングループ
SceneKitは、SCNSceneRendererDelegate
で説明されているレンダリングループの一部として物理シミュレーションを評価します。このループを通過するたびに、SceneKitは、物理ボディがアタッチされたすべてのノードの状態を判別し、たとえば、速度と角速度に基づいてボディの位置または回転を更新することにより、これらのボディに対する物理の影響を1タイムステップでシミュレートします。その後、SceneKitは物理シミュレーションの結果をシーンに適用して表示します。
SceneKitコンテンツは、物理学だけでなく、アクションや暗黙的および明示的に定義されたアニメーションを通じてもアニメーション化できるため、SceneKitは、物理シミュレーションの結果をSCNNode
シーン内のpresentation
オブジェクトではなく、現在表示されている状態を表す各ノードのオブジェクトに適用します。そのため、物理学の影響を受けるノードのプロパティを変更するには、特別な考慮が必要です。
物理学の影響を受けるノードのtransform
値、または変換のコンポーネントであるその他のプロパティ(position
およびrotation
など)を変更すると、SceneKitはそのノードの物理シミュレーションをリセットします。以下に示すように、変換の1つのコンポーネントのみを変更し、他のコンポーネントは物理シミュレーション値のままにしておきたい場合は、変更を加える前にプレゼンテーションノードの変換をコピーします。
// Copy the presentation node's transform to the model
node.node.transform = node.presentationNode.transform
// Change one component of the new transform
node.eulerAngles.z = newRollValue
トピック
物理ボディの作成
init(type: SCNPhysicsBodyType, shape: SCNPhysicsShape?)
指定されたタイプと形状の物理ボディを作成します。
class func `static`() -> Self
力や衝突の影響を受けず、移動できない物理ボディを作成します。
class func dynamic() -> Self
力や衝突の影響を受ける可能性のある物理ボディを作成します。
class func kinematic() -> Self
力や衝突の影響を受けないが、移動すると他のボディに影響を与える衝突を引き起こす可能性のある物理ボディを作成します。
力が物理体にどのように影響するかを定義する
var physicsShape: SCNPhysicsShape?
衝突検出で使用するための物理ボディのソリッドボリュームを定義するオブジェクト。
var type: SCNPhysicsBodyType
物理体が力や衝突にどのように反応するかを決定する定数。
enum SCNPhysicsBodyType
物理ボディが力や他のボディとどのように相互作用するかを決定する定数。type
プロパティで使用され、物理ボディを作成するときに使用されます。
var velocityFactor: SCNVector3
SceneKitが物理シミュレーションによって計算された変換を物理ボディを含むノードに適用する方法に影響を与える乗数。
var angularVelocityFactor: SCNVector3
SceneKitが物理シミュレーションによって計算された回転を物理ボディを含むノードに適用する方法に影響を与える乗数。
var isAffectedByGravity: Bool
シーンの一定の重力が体を加速するかどうかを決定するブール値。
ボディの物理的特性の定義
var mass: CGFloat
体の質量(キログラム)。
var charge: CGFloat
クーロン単位の体の電荷。
var friction: CGFloat
スライド運動に対する身体の抵抗。
var rollingFriction: CGFloat
転がり運動に対する体の抵抗。
var restitution: CGFloat
衝突で体が失うまたは得る運動エネルギーの量を決定する要因。
var damping: CGFloat
体の直線速度を低下させる要因。
var angularDamping: CGFloat
体の角速度を低下させる要因。
var momentOfInertia: SCNVector3
ボディを含むノードのローカル座標系で表される、ボディの慣性モーメント。
var usesDefaultMomentOfInertia: Bool
SceneKitがボディの慣性モーメントを自動的に計算するか、カスタム値を設定できるかを決定するブール値。
var centerOfMassOffset: SCNVector3
ローカル座標の原点に対するボディの重心の位置。
コンタクト先と衝突
var categoryBitMask: Int
この物理ボディが属するカテゴリを定義するマスク。
var contactTestBitMask: Int
ボディのどのカテゴリがこの物理ボディとの交差通知を引き起こすかを定義するマスク。
var collisionBitMask: Int
物理ボディのどのカテゴリがこの物理ボディと衝突できるかを定義するマスク。
struct SCNPhysicsCollisionCategory
物理ボディとプロパティのデフォルト値。
categoryBitMask
collisionBitMask
var continuousCollisionDetectionThreshold: CGFloat
SceneKitが他のボディとの接触を検出するためのより正確な(ただしよりコストのかかる)アルゴリズムを適用するためにボディが移動する必要のある最小距離。
力、インパルス、およびトルクの適用
func applyForce(SCNVector3, asImpulse: Bool)
重心で体に力または衝撃を加えます。
func applyForce(SCNVector3, at: SCNVector3, asImpulse: Bool)
特定のポイントで体に力または衝撃を加えます。
func applyTorque(SCNVector4, asImpulse: Bool)
正味のトルクまたは角運動量の変化を体に適用します。
func clearAllForces()
現在のシミュレーションステップ中に物理ボディに作用するすべての連続的な力とトルクをキャンセルします。
動いているボディとの相互作用
var velocity: SCNVector3
現在の速度(メートル/秒)と物理体の運動方向の両方を表すベクトル。
var angularVelocity: SCNVector4
物理体の現在の回転軸と回転速度(ラジアン/秒)の両方を表すベクトル。
いつボディが動くことができるかを定義する
var isResting: Bool
物理ボディが静止しているかどうかを示すブール値。
var allowsResting: Bool
SceneKitが静止している物理ボディを自動的にマークできるかどうかを指定するブール値。
func setResting(Bool)
ボディを現在動いているものとして扱うかどうかをSceneKitに指示します。
物理ボディとそのノードの同期
func resetTransform()
物理シミュレーションでボディの位置と方向を更新して、ボディが接続されているノードの位置と方向に一致させます。
インスタンスのプロパティ
var angularRestingThreshold: CGFloat
var linearRestingThreshold: CGFloat