2

私は、Java と弾丸の物理学を一度に学習することで、自分の道を戦い抜こうとしています。一度にすべてを行うには少し多すぎる可能性がありますが、私は挑戦が好きです.

これまでのところ、次のコードを使用して、g3db オブジェクトをインポートし、それらに弾丸物理学を適用し、画面上で操作する方法を学びました。

assets = new AssetManager();
assets.load("globe.g3db", Model.class);
assets.load("crate.g3db", Model.class);
assets.finishLoading();

Model model = assets.get("globe.g3db", Model.class);
ModelInstance inst = new ModelInstance(model);
inst.transform.trn(0, 20, 0);

btRigidBody body;
btSphereShape sh = new btSphereShape(1);
sh.calculateLocalInertia(1, new Vector3(0,0,0));

body = new btRigidBody(new btRigidBody.btRigidBodyConstructionInfo(3, new btDefaultMotionState(inst.transform), sh));
body.setUserValue(Minstances.size);
body.proceedToTransform(inst.transform);

motionState = new MyMotionState();
motionState.transform = inst.transform;
body.setMotionState(motionState);

dynamicsWorld.addRigidBody(body );
Minstances.add(inst);

これはうまく機能します。地面の上に置くと、落下して地面に静止しますが、動き回ると転がらずに滑ります。簡単な修正はありますか?

4

2 に答える 2

2

物理的なボディのローリングを可能にするには、そのローカル慣性を計算し、それを構造情報に提供する必要があります。あなたのコードでは、ほとんど正しくやっています。

方法

btCollisionShape.calculateLocalInertia(float mass, Vector3 inertia)

実際にローカル慣性を計算しますが、それを 2 番目の引数 'Vector3 inertia' に格納します。それ自体には変更は適用されませんbtCollisionShape

慣性のベクトルを取得したら、それを渡す必要があります

btRigidBodyConstructionInfo(float mass, btMotionState motionState, btCollisionShape collisionShape, Vector3 localInertia)

最後の引数として。

正しいコードは次のようになります。

btRigidBody body;
btSphereShape sh = new btSphereShape(1);
Vector3 inertia = new Vector3(0,0,0);
sh.calculateLocalInertia(1, inertia);

body = new btRigidBody(new btRigidBody.btRigidBodyConstructionInfo(3, new btDefaultMotionState(inst.transform), sh, inertia));

シミュレーションの実行にローカル慣性は必要ありませんが、ローカル慣性がないと、ボディに適用されるすべての力が中心力として扱われるため、角速度に影響を与えることができません。

于 2015-10-14T20:03:48.787 に答える
0

回転も読み込んで設定する必要があります。現在は、翻訳を読み込んで \ 適用しています。

新しいクォータニオンを作成し、xyzw 値を取得してオブジェクトに適用します。

このようなもの(C++コードですが、Javaでも同じことが簡単にできます):

btTransform trans;
Quat myquat;
yourBulletDynamicObject->getMotionState()->getWorldTransform(trans);

btQuaternion rot = trans.getRotation();
myquat.w = rot.w();
myquat.x = rot.x();
myquat.y = rot.z();
myquat.z = rot.y();

オブジェクトに myquat を戻します。

于 2014-06-30T11:34:16.657 に答える