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). Новая строка добавляет, что не реализует этот сдвиг, оставляя объект в центре позиции бокс-сета. Однако этот способ решения проблемы может создать проблемы, когда в конечном объекте фактически используется составная сетка.