サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

Bullet ラッパーのカスタムクラス

場合によっては、C++bullet のクラス/メソッドをJava のクラス/メソッドに内包させることができません。 この場合はカスタムクラスやカスタムメソッドを使ったC++とJavaの橋渡しをします。 以下の一覧はそうしたカスタムクラスについて説明しています。 この一覧は完全なものではないかもしれないので注意してください。



btCollisionObject

btCollisionObject は、毎回Java オブジェクトを新規作成するのではなく、Java オブジェクトを再利用するよう変更が行われています。 この変更は静的なbtCollisionObject.instancesマップを使って行われています。 マップからオブジェクトを削除してネイティブオブジェクトを消去するには、 disposeメソッドを使用します。

インスタンスを再利用する以外にも、Bulletラッパーではインスタンスを特定するための固有の番号が使えます。 例えば、entityシステムにおけるentityのインデックス/IDなどです。 頻繁に呼び出されるメソッドの中には、インスタンス自身の代わりにこの値を使用することができます。 これを使えば、 C++のインスタンスとJavaのインスタンスの紐付けを行う際のオーバーヘッドが完全になくなります。 setUserValue(int); メソッドを使ってこの値を設定し、getUserValue(); メソッドを使ってこの値を取得することができます。

public class MyGameObject {
  public btCollisionObject body;
}
...
Array<MyGameObject> gameObjects;
...
gameObjects.add(myGameObject);
myGameObject.body.setUserValue(gameObjects.size-1);

userData フィールドを使っていくつかの追加データを追加することができます。例えば:

btCollisionObject obj = new btCollisionObject();
obj.userData = myGameObject;
...
if (obj.userData instanceof MyGameObject)
  myGameObject = (MyGameObject)obj.userData;

btCollisionObject adds the methods takeOwnership and releaseOwnership which can be used to remove or make the wrapper responsable for destroying the native object when the Java object is destroyed by the garbage collector.

btCollisionObject には以下のメソッドも追加されています:

  • getAnisotropicFriction(Vector3)
  • getWorldTransform(Matrix4)
  • getInterpolationWorldTransform(Matrix4)
  • getInterpolationLinearVelocity(Vector3)
  • getInterpolationAngularVelocity(Vector3)
  • getContactCallbackFlag() and setContactCallbackFlag(int)
  • getContactCallbackFilter() and setContactCallbackFilter(int)


ClosestNotMeConvexResultCallback

ClosestNotMeConvexResultCallbackクラスは ClosestConvexResultCallback をカスタム実装したもので、 これを使って指定したオブジェクト以外の全てのオブジェクトに対してconvexSweepTest を実行することができます。



ClosestNotMeRayResultCallback

ClosestNotMeRayResultCallback クラスは ClosestRayResultCallback をカスタム実装したもので、 これを使って指定したオブジェクト以外の全てのオブジェクトに対してrayTest を実行することができます。



InternalTickCallback

InternalTickCallback は、btDynamicsWorld#setInternalTickCallbackで必要なコールバックをJavaクラスへ橋渡しするために実装されています。 このクラスを拡張して onInternalTick メソッドを上書きすることができます。 attachメソッドと detach メソッドを使って、tick コールバック取得の開始と停止を行えます。



btDefaultMotionState

場合によっては、btMotionStateを拡張するのではなくbtDefaultMotionStateを使った方が簡単です。 btDefaultMotionStateでは以下のカスタムメソッドが使用できます。

  • getGraphicsWorldTrans(Matrix4)
  • getCenterOfMassOffset(Matrix4)
  • getStartWorldTrans(Matrix4) 独自実装で btMotionState を拡張する方が望ましいです。


btCompoundShape

btCompoundShape クラスを使えば子shapeへの参照を保持できるので、あなた自身で参照を管理する手間が省けます。 これを使用するには、第三引数managed にtrueを設定してaddChildShapeを実行してください。 CompoundShapeが削除された場合、このクラスが管理している子shapeも削除されるので注意してください。 そのため、管理している子shapeはCompoundShape以外のshapeには所属しないようにする必要があります。



btIndexedMesh

btIndexedMesh クラスにはコンストラクタが追加されています:

  • btIndexedMesh(Mesh) そして、以下のメソッドも追加されています:
  • setTriangleIndexBase(ShortBuffer)
  • setVertexBase(FloatBuffer)
  • set(Mesh) For easy constructing or setting a btIndexedMesh based on a Mesh instance or a vertex and index buffer. The buffers itself are not managed by the wrapper and should out-live the object.


btTriangleIndexVertexArray

btTriangleIndexVertexArray クラスは、保持しているJavabtIndexedMeshクラスへの参照を管理する機能が追加されています。 これを使用するには、最後の引数managedにtrueを設定して addIndexedMeshを実行してください。 btTriangleIndexVertexArray が破棄された時、それが管理している子 btIndexedMesh も破棄されます。

また、btTriangleIndexVertexArray クラスには addMesh メソッドと addModel メソッドとコンストラクタが追加されており、 クラスの構築や設定が簡単にできます。



btBvhTriangleMeshShape

btBvhTriangleMeshShape クラスにはJava btStridingMeshInterfaceクラスへの参照を管理する機能が追加されています。 これを使用するには、managed引数にtrueを設定してクラスを構築します。 btBvhTriangleMeshShape が破棄された時、それが管理している btStridingMeshInterfaceもは帰されます。

また、btBvhTriangleMeshShape クラスにはコンストラクタが追加されており、複数の MeshModel インスタンスの構築が簡単にできます。



btConvexHullShape

btConvexHullShape クラスには便利なコンストラクタ btConvexHullShape(btShapeHull)が追加されています。



btBroadphasePairArray

The btBroadphasePairArray クラスには全ての衝突オブジェクトを一度に取得するメソッドが追加されています:

btBroadphasePairArray.getCollisionObjects(Array<btCollisionObject> out, btCollisionObject other, int[] tempArray)
btBroadphasePairArray.getCollisionObjectsValue(int[] out, btCollisionObject other)


FilterableVehicleRaycaster

FilterableVehicleRaycaster クラスは btDefaultVehicleRaycaster クラスを拡張しており、グループとマスクを使った衝突フィルタリングのサポートが追加されています。:

FilterableVehicleRaycaster raycaster = new FilterableVehicleRaycaster(dynamicsWorld);
raycaster.setCollisionFilterGroup(FILTER_GROUP);
raycaster.setCollisionFilterMask(FILTER_MASK);
btRaycastVehicle vehicle = new btRaycastVehicle(vehicleTuning, chassis, raycaster);