-1

I am working on a game. I constructed my player as here: (I am using a gravity on my world)

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

Then, in render method I am moving it:

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

That's nice! The moving now works good, when I am moving at the flat ground. Whenever there is an object before me, it is not as expected. Because my player shape is biger than object shape (which is 2.5f, 2.5f, 2.5f), it kind of falls on it. So I would like to set the rotation to be still the same, so the object will not be rotating (so it will not "fall" on the object before). And so I tried to do it, and I failed. Because there are functions like rotate, and I want to something like setRotation . And so, there is a setToRotation, but you can not pass there a Quaternion.

I need help. I tried to use a btKinematicCharacterController but it was bad. The ghostObject every time falled through object, but the objects got a collision from him.

and so I want to create a player movment, like in games like Wow, minecraft, and so on.


I looked at the btKinematicCharacterController again. The reason why my ghostobject falled through the ground was. Generally, I don't know the reason: D probably I was using another broadphase for ghost, that for world. This line fixes it: characterController.setUseGhostSweepTest(false); and I am getting another problem, when I am walking on my ground (a lot of objects), the character is getting to lesser Y position. I don't know why. Here is my construction:

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

How to fix this?

4

1 回答 1

0

我设置了 debugDrawer,所以我能够看到子弹对象的形状。我的问题是:ghostObject(charController) 将我的对象向下推。虽然我的对象是静态的。所以我将物体的质量设置为 0,问题就解决了。但我仍然不知道,它是如何推动静态对象的。但我不在乎。:)

编辑:我会在 2 小时内接受这个答案,因为现在我不能。

于 2014-12-05T13:05:56.870 回答