私はゲームに取り組んでいます。私はここに私のプレーヤーを構築しました: (私は自分の世界で重力を使用しています)
private ArrayMap<String, GameObject.Constructor> constructors = new ArrayMap<String, GameObject.Constructor>(String.class, GameObject.Constructor.class);
private ArrayList<GameObject> instances = new ArrayList<GameObject>();
assets.load("hand.obj", Model.class);
...
model = assets.get("hand.obj", Model.class);
constructors.put("hand", new GameObject.Constructor(model, new btBoxShape(new Vector3(2.5f, 7.5f, 2.5f)), 1f));
...
hand = constructors.get("hand").construct(); // that construct method returns me model, shape and constructions.. the GameObject extends ModelInstance, so i can use it like a modelinstance
hand.transform.setToTranslation(x, y, z);
hand.body.proceedToTransform(hand.transform);
hand.body.setUserValue(instances.size());
hand.body.setCollisionFlags(hand.body.getCollisionFlags()| btCollisionObject.CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK);
world.addRigidBody(hand.body);
hand.body.setContactCallbackFlag(OBJECT_FLAG);
hand.body.setContactCallbackFilter(OBJECT_FLAG);
次に、render メソッドで移動します。
if (!hand.body.isActive()) hand.body.activate();
if (Gdx.input.isKeyPressed(Keys.W)){
hand.body.translate(new Vector3(0,0,-1));
}
else if (Gdx.input.isKeyPressed(Keys.S)) {
hand.body.translate(new Vector3(0,0,+1));
}
それはすばらしい!平地での移動時、動きが良くなりました。目の前に物体があるときはいつでも、それは予想通りではありません。私のプレーヤーの形状はオブジェクトの形状 (2.5f、2.5f、2.5f) よりも大きいため、その上に落ちます。したがって、回転を同じに設定したいので、オブジェクトは回転しません(そのため、前にオブジェクトに「落ちる」ことはありません)。それで私はそれをやろうとしましたが、失敗しました。回転のような関数があり、 setRotation のようなものが欲しいからです。そのため、setToRotation がありますが、Quaternion を渡すことはできません。
私は助けが必要です。btKinematicCharacterController を使用しようとしましたが、うまくいきませんでした。ゴーストオブジェクトは毎回オブジェクトを通り抜けましたが、オブジェクトは彼から衝突を受けました。
だから、WOW やマインクラフトなどのゲームのように、プレイヤーの動きを作りたいと思っています。
あらためて見ましたbtKinematicCharacterController
。私のゴーストオブジェクトが地面を突き抜けた理由は、一般的に、理由はわかりません。おそらく、ゴースト用に別のブロード フェーズを使用していたのでしょう。それはワールド用です。この行はそれを修正します。characterController.setUseGhostSweepTest(false);
別の問題が発生しています。地面 (多くのオブジェクト) を歩いていると、キャラクターの Y 位置が低くなります。どうしてか分かりません。ここに私の構造があります:
btPairCachingGhostObject ghostObject;
btConvexShape ghostShape;
btKinematicCharacterController characterController;
Vector3 characterDirection = new Vector3();
Vector3 walkDirection = new Vector3();
...
ghostObject = new btPairCachingGhostObject();
ghostObject.setWorldTransform(hand.transform);
ghostShape = new btCapsuleShape(5f, 0.5f);
ghostObject.setCollisionShape(ghostShape);
ghostObject.setCollisionFlags(btCollisionObject.CollisionFlags.CF_CHARACTER_OBJECT);
characterController = new btKinematicCharacterController(ghostObject, ghostShape, .00001f);
// And add it to the physics world
characterController.setUseGhostSweepTest(false);
world.addCollisionObject(ghostObject,
(short)btBroadphaseProxy.CollisionFilterGroups.CharacterFilter,
(short)(btBroadphaseProxy.CollisionFilterGroups.StaticFilter | btBroadphaseProxy.CollisionFilterGroups.DefaultFilter));
world.addAction(characterController);
... (in render - moving)
if (!load)
{
if (Gdx.input.isKeyPressed(Keys.LEFT)) {
hand.transform.rotate(0, 1, 0, 5f);
ghostObject.setWorldTransform(hand.transform);
}
if (Gdx.input.isKeyPressed(Keys.RIGHT)) {
hand.transform.rotate(0, 1, 0, -5f);
ghostObject.setWorldTransform(hand.transform);
}
// Fetch which direction the character is facing now
characterDirection.set(-1,0,0).rot(hand.transform).nor();
// Set the walking direction accordingly (either forward or backward)
walkDirection.set(0,0,0);
if (Gdx.input.isKeyPressed(Keys.UP))
walkDirection.add(characterDirection);
if (Gdx.input.isKeyPressed(Keys.DOWN))
walkDirection.add(-characterDirection.x, -characterDirection.y, -characterDirection.z);
walkDirection.scl(4f * Gdx.graphics.getDeltaTime());
// And update the character controller
characterController.setWalkDirection(walkDirection);
// And fetch the new transformation of the character (this will make the model be rendered correctly)
}
world.stepSimulation(delta, 5, 1f/60f);
if (!load)
ghostObject.getWorldTransform(hand.transform);
これを修正する方法は?