Bullet 2.76 Physics SDK マニュアル
8. 拘束条件
Bulletでは拘束条件を扱うことができます。各拘束条件の例は、Demos/ConstraintDemoをご覧ください。btRaycastVehicleを含むすべての拘束条件は、btTypedConstraintから派生したクラスです。拘束条件は2つの剛体間に働く制約であり、その両者のうち少なくとも片方は、動的オブジェクトでなければなりません。
点結合拘束条件
点結合拘束条件は、ワールド空間にある2つの剛体のローカルピボットにより移動を制限することができます。この拘束条件を使えば、剛体同士を繋ぐことができます。
btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA); btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB);
[図]
蝶番拘束条件
蝶番拘束条件(回転関節)は、点結合に加えて回転を制限したものです。つまり2つの剛体はある軸(蝶番軸)を中心にしか回転しません。これは1軸を中心に回転するドアやホイールなどを表現するのに便利です。また、その角度に制限をつけたり、蝶番を動かしたりすることも可能です。
btHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA = false);
btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,btVector3& axisInA, bool useReferenceFrameA = false);
btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3&
pivotInB, btVector3& axisInA,btVector3& axisInB, bool useReferenceFrameA = false);
btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false);
[図]
スライダ拘束条件
スライダ拘束条件は、剛体を1軸まわりでしか回転させないようにし、更にこの軸に沿ってしか移動できないようにします。
btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
[図]
コーンツイスト拘束条件
ダミー人形を作るような場合、上腕のような部位を表すのにコーンツイスト拘束条件は非常に便利です。点結合に、円錐内でしか動けない制限とひねり角度の制限を加えた拘束条件です。
btConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame);
btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame);
6DOF拘束条件
これは各6つの角度(6dof:6 degrees of freedom)に制限を与えることにより、拘束条件を汎用的に表します。6つのうち3つは、剛体が移動する直線軸であり、残り3つは回転軸を表します。各軸はロックしたり、制限したりすることができます。btGeneric6DofConstraintのインスタンスを生成したときには、6つの軸はすべてロックされています。生成後に、各軸について設定を行います。制限の組み合わせによっては、あり得ない拘束条件になってしまうので、注意してください。
btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
通常、以下のようにして使います。
btVector3 lowerSliderLimit = btVector3(-10,0,0);
btVector3 hiSliderLimit = btVector3(10,0,0);
btGeneric6DofConstraint* slider = new btGeneric6DofConstraint(*d6body0,*fixedBody1,frameInA,frameInB);
slider->setLinearLowerLimit(lowerSliderLimit);
slider->setLinearUpperLimit(hiSliderLimit);
各軸に対して、以下のように設定が可能です。
Lowerlimit == Upperlimit -> この軸はロックされます。
Lowerlimit > Upperlimit -> この軸は自由に動けます。
Lowerlimit < Upperlimit -> この軸の角度は制限されます。