-1

私はゲームに取り組んでいます。私はここに私のプレーヤーを構築しました: (私は自分の世界で重力を使用しています)

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);

これを修正する方法は?

4

1 に答える 1

0

私は debugDrawer を設定したので、弾丸オブジェクトの形状を見ることができました..そして私の問題はそれでした.ghostObject(charController)が私のオブジェクトを押し下げていました..私のオブジェクトは静的でしたが. だから私はオブジェクトの質量を0に設定し、問題は修正されました。しかし、静的オブジェクトをプッシュする方法はまだわかりません。しかし、私は気にしません。:)

編集:今はできないので、2時間以内にこの回答を受け入れます。

于 2014-12-05T13:05:56.870 に答える