Держатель камеры jBullet не двигается

Я использую jBullet с OpenGL для создания базового игрового движка. Я создал два класса с именами ObjectSurface и ObjectEntity. В основном ObjectSurface не имеют массы, поэтому они не двигаются, а ObjectEntity могут двигаться за счет столкновения или гравитации.

Я создал камеру с объектом ObjectEntity с именем cameraHolder, чтобы она могла падать и иметь столкновение и все такое.

Проблема в том, что cameraHolder должен двигаться при нажатии определенной клавиши WASD, но он перемещается только на один юнит и больше не движется. Когда кнопку отпускают, она перемещается на одну единицу в противоположном направлении, чтобы вы оказались в том же месте. И после того, как cameraHolder перемещается, XYZ камеры устанавливаются в координаты XYZ cameraHolder.

Однако движение работает для движения, вызванного jBullet, который падает из-за гравитации.

И когда я не использую обновления jBullet, cameraHolder двигается нормально. Так что проблема должна быть с обновлениями jBullet. Я покажу это в коде.

Вопрос. Почему держатель камеры перемещается только на 1 единицу, а затем возвращается назад при нажатии определенных кнопок WASD?

Вот код движения в классе Camera.java:

public void move(float amount, float direction) {

if(!still){
    if (direction == MOVE_BACKWARD) {
        //MOVE BACKWARDS (CODE NOT NEEDED, WORKS WITHOUT CAMERA CARRIER)
        }

        if (direction == MOVE_FORWARD) {
        //MOVE FORWARD
        }

        if (direction == MOVE_LEFT) {
        //MOVE LEFT
        }

        if (direction == MOVE_RIGHT) {
        //MOVE RIGHT
        }
    }
}

public void carryCamera() {
    if(!still){
    x = cameraHolder.pos.x;
    y = cameraHolder.pos.y;
    z = cameraHolder.pos.z;
    }
}

Вот как создается ObjectEntity:

private void createShape() {
    DefaultMotionState fallMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(pos.x, pos.y, pos.z), 1.0f)));
    Vector3f fallInertia = new Vector3f(0,0,0); 
    shape.calculateLocalInertia(mass,fallInertia); 
    RigidBodyConstructionInfo fallRigidBodyCI = new RigidBodyConstructionInfo(mass,fallMotionState,shape,fallInertia); 
    body = new RigidBody(fallRigidBodyCI); 
    Engine.getDynamicsWorld().addRigidBody(body); 
}

Вот как создается Мир Физики:

private static void initPhysics() {
    BroadphaseInterface broadphase = new DbvtBroadphase();
    DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
    CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);
    SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
    dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
    dynamicsWorld.setGravity(Game.gravity);
}

Как получают входные данные и обновляют физику (В ЭТОЙ ЧАСТИ ЕСТЬ ПОДОЗРИТЕЛЬНЫЙ КОД):

public static Vector3f gravity = new Vector3f(0, -10, 0); //GRAVITY
private ArrayList<Object> objects; //ALL THE OBJECTS IN THE GAME (CAMERAHOLDER IS IN HERE)

        //GETTING INPUT, USING move() METHOD IN CAMERA CLASS TO MOVE HOLDER.
public void getInput() {

    if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL))
        speedMultiplier = 3;

    if (Keyboard.isKeyDown(Keyboard.KEY_W))
        cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_FORWARD);

    if (Keyboard.isKeyDown(Keyboard.KEY_S))
        cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_BACKWARD);

    if (Keyboard.isKeyDown(Keyboard.KEY_A))
        cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_LEFT);

    if (Keyboard.isKeyDown(Keyboard.KEY_D))
        cam.move(cam.getMoveSpeed() * speedMultiplier, Camera.MOVE_RIGHT);

    cam.carryCamera(); //MOVES THE ACTUAL CAMERA TO THE HOLDER.
    speedMultiplier = 1;

}

public void update() {
    applyJBullet();
}

        //AND JBULLET PHYSICS ARE APPLIED HERE (SUSPICIOUS CODE!!!)
public void applyJBullet(){
Engine.getDynamicsWorld().stepSimulation(1/60.f, 10); //SIMULATES NEXT FRAME

    for (Object o : objects) { 
        if(o.getMass() >= 1){ //ALL THE OBJECTS WITH MASS ARE FOUND

    Transform trans = new Transform();   //CREATING A NEW TRANSFORM
    o.getBody().getMotionState().getWorldTransform(trans); //GET THE SIMULATED LOCATION

//It still doesn't work when I do: "trans.origin.x+=2" here. The same problem occurs.
    o.setPos(trans.origin); //AND SET IT AS THE OBJECTS POSITION
        }   
    }
}

person Sierox    schedule 12.08.2013    source источник


Ответы (1)


Я думаю, что лучше, чем просто использовать коробчатую форму, иметь кинематическое тело. Чтобы превратить тело камеры в «кинематическое тело» (предпочтительно одностороннее столкновение, перемещаемое пользователем), вызовите следующее:

body.setCollisionFlags(body.ge­tCollisionFlags() | CollisionFlags.KINEMATIC_OBJEC­T);
body.setActivationState(Collis­ionObject.DISABLE_DEACTIVATION­);
person Jaspreet    schedule 20.08.2013