BetterCharacterControl не применяет RigidBody в нужной позиции

Так что я новичок в JME3, и у меня есть несколько проблем с пониманием BetterCharacterControl.

Когда я пытаюсь применить BetterCharacterControl к блоку, он всегда "расширяется" от верхней части блока вместо центра. (Картинка объясняет это лучше:)

Эта проблема

Я не могу найти какие-либо функции для изменения местоположения, в котором он применяется, я уже пытался создать подкласс, в котором я напрямую изменил RigidBody на BoxCollisionShape, но, похоже, что-то испортило метод isOnGround. Также, если я захочу использовать склоны позже, было бы неплохо иметь форму капсулы.

Box box2 = new Box(10, 15, 10);
player = new Geometry("Player", box2);
player.setLocalTranslation(new Vector3f(0, 20, 0));
Material mat = new Material(assetManager, 
            "Common/MatDefs/Light/Lighting.j3md");
mat.setBoolean("UseMaterialColors", true);
mat.setColor("Ambient", ColorRGBA.Blue);
mat.setColor("Diffuse", ColorRGBA.Blue);
player.setMaterial(mat);

playerC = new BetterCharacterControl(12, 30, 0);
playerC.setJumpForce(new Vector3f(0, 700, 0));
player.addControl(playerC);

rootNode.attachChild(player);

bulletAppState.getPhysicsSpace().add(playerC);

С другой стороны, кажется, что мне нужно применить огромный вектор для силы прыжка, чтобы он что-то делал (я не менял значения гравитации)

Я рад за любую помощь

1 ответ

У меня была такая же проблема. То, как я решил, это не обычное дело. Я кодировал класс и унаследовал от метода getShape() BetterCharacterControl, переписав его следующим образом:

protected CollisionShape getShape() {
    //TODO: cleanup size mess..
    CapsuleCollisionShape capsuleCollisionShape = new CapsuleCollisionShape(getFinalRadius(), (getFinalHeight() - (2 * getFinalRadius())));
    CompoundCollisionShape compoundCollisionShape = new CompoundCollisionShape();
    //Vector3f addLocation = new Vector3f(0, (getFinalHeight() / 2.0f), 0); REMOVED LINE
    Vector3f addLocation = new Vector3f(0, 0, 0); //NEW LINE
    compoundCollisionShape.addChildShape(capsuleCollisionShape, addLocation);
    return compoundCollisionShape;
}

Это работает, потому что исходный код является составным, созданным таким образом, что дочерний узел смещается на значение: (getFinalHeight () / 2.0f). Новая строка добавляет, что не реализует этот сдвиг, оставляя объект в центре позиции бокс-сета. Однако этот способ решения проблемы может создать проблемы, когда в конечном объекте фактически используется составная сетка.

Другие вопросы по тегам