我正在开发一款游戏。我在这里建造了我的玩家:(我在世界上使用引力)
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);
如何解决这个问题?
答案 0 :(得分:0)
我设置了debugDrawer,所以我能够看到子弹对象的形状..我的问题是:ghostObject(charController)正在推动我的对象..虽然我的对象是静态的。所以我将对象的质量设置为0并且问题是固定的。但我还是不知道它是如何推动静态物体的。但我不在乎。 :)
编辑:我会在2个小时内接受这个答案,因为现在我不能。