Physics2DSampleのPrimitiveSceneのまとめ

PS Suite SDKの話。
Physics2Dのサンプルとしてある、Physics2DSample。
一つのプロジェクトの中に多くの機能説明がされているが、
一番基礎と思われるPrimitiveSceneについて。

このサンプルでしていること

  1. PhyiscsSceneを作成し、物理シミュレーションの場所を用意。
  2. その中に、PhysicsShapeとPhysicsBodyで各剛体を作成。
  3. VertexBufferを用いて剛体描画用として準備。
  4. Physics2Dで物理シミュレート。
  5. その情報をもとにVertexBufferで用意した図形を、移動回転などさせて描画。
  6. デバッグ情報(DrawAdditionalInfo)

1・PhyiscsSceneを作成し、物理シミュレーションの場所を用意

PhysicsSceneは2次元物理シミュレーションシーンを表すクラスです。シミュレーションはシーン単位で実行されます。

このクラスがPhysics2Dの根幹。
重要なのは

void Simulate (int click_index, ref Vector2 click_pos, ref Vector2 diff_pos)
シミュレートする
virtual void DrawAllBody (ref GraphicsContext graphics, ref ShaderProgram program, Matrix4 rendering_scale, int click_index)
レンダリングをユーザーが定義する
virtual void DrawAllBody (ref GraphicsContext graphics, ref ShaderProgram program, Matrix4 rendering_scale, int click_index)
レンダリングをユーザーが定義する

この3つ。
UI・Physics2D・GameEngine2D
↑である程度説明がありそれで十分かと。

2・その中に、PhysicsShapeとPhysicsBodyで各剛体を作成。

PhysicsBodyは基本的な2次元剛体を表すクラスで、速度、加速度など剛体の様々な属性を保持します。

PhysicsShapeは基本的な2次元衝突形状を表すクラスで、30個の頂点を上限とした凸形状です。ただし、球については頂点0個の凸形状として例外として扱います。

つまり、
PhysicsShapeで形状を定義、PhysicsBodyで状態を管理する。

PhysicsShape

サンプルの157行目あたりから作成している。

PhysicsShape (Vector2 width)
PhysicsShape (float radius)
PhysicsShape (Vector2[] pos, int num)

で、かべ・ボックス・球体・ランダムな凸形状(サンプルではランダムのシードが10)を作成。

PhysicsBody

サンプルの187行目から320行目までと長々作成をしている。
187行目。Create static walls to limit the range of action of active rigid sceneBodies
かべの作成。
219行目。Create dynamic rigid sceneBodies
ダイナミック剛体の作成。
250行目。Create static rigid sceneBodies
スタティック剛体の作成。
283行目。Create kinematic rigid sceneBodies
キネマティック剛体の作成。

BodyType

dynamicとかは、Phycis2D.BodyTypeで定義されている。

DYNAMIC 一般的なダイナミック剛体。常に動いている。
STATIC スタティック剛体。最初から最後まで動くことがない
KINEMATIC キネマティック剛体。しばらく動かないが、何かのイベントで動くようになる。
TRIGGER トリガー剛体。衝突反発はないが、衝突判定はある
キネマティック剛体

キネマティック剛体は、285行目のコメントの通り。
ダイナミック剛体として初めに生み出され、
PhysicsBody.SetBodyKinematic()でキネマティック剛体化する。

サンプルでは〇ボタン(A)を押すたびに、

PhysicsBody.BackToDynamic();
PhysicsBody.SetBodyKinematic();

が呼び出され、キネマティック剛体⇔ダイナミック剛体が入れ替わる。

スタティック剛体

また、スタティック剛体に対してサンプルでは明示的に

PhysicsBody.SetBodyStatic();

が呼び出されてはいないが、

new PhysicsBody(shape , PhysicsUtility.FltMax);

const float FltMax = 1E+37f
Physics2D計算内で使用するFltMax.

と質量を最大にすることでStatic化している(はず。)

トリガー剛体(2012/5/25追記)

↓を参照。
Physics2DのTriggerObjectScene - にゃーん

3・VertexBufferを用いて剛体描画用として準備

.>
Sce.Pss.Core.Graphics.VertexBuffer
VertexBufferは頂点データを格納するクラスであり、OpenGLにおける頂点バッファオブジェクトを表します。必要に応じて複数の頂点配列、一つのインデクス配列を格納することができ、サイズと形式を指定して作成します。