移动3D角色 - 不希望任何物理,预期碰撞和重力

时间:2014-12-03 15:07:02

标签: libgdx bullet

我正在开发一款游戏。我在这里建造了我的玩家:(我在世界上使用引力)

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

然后,在渲染方法中,我正在移动它:

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),它有点落在它上面。所以我想将旋转设置为相同,因此对象不会旋转(因此它不会在#34;之前落在&#34;之前)。所以我试着这样做,但我失败了。因为有像旋转这样的函数,我想要像setRotation这样的东西  。所以,有一个setToRotation,但是你无法通过那里的四元数。

我需要帮助。我试图使用btKinematicCharacterController,但它很糟糕。 ghostObject每次都通过物体撞击,但物​​体与他发生碰撞。

所以我想创建一个玩家动作,就像在Wow,minecraft等游戏中一样。


我再次看了btKinematicCharacterController。我的ghostobject在地面上摔倒的原因是。一般来说,我不知道原因:D我可能正在使用另一个广角用于鬼,对于世界而言。这一行修复了它: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);

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我设置了debugDrawer,所以我能够看到子弹对象的形状..我的问题是:ghostObject(charController)正在推动我的对象..虽然我的对象是静态的。所以我将对象的质量设置为0并且问题是固定的。但我还是不知道它是如何推动静态物体的。但我不在乎。 :)

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