Java jBullet照相机“;持有人;他不动了

Java jBullet照相机“;持有人;他不动了,java,camera,bulletphysics,jbullet,Java,Camera,Bulletphysics,Jbullet,我正在使用jBullet和OpenGL创建一个基本的游戏引擎。我创建了两个名为ObjectSurface和ObjectEntity的类。基本上,ObjectSurface没有质量,所以它们不会移动,ObjectEntity可以通过碰撞或重力移动 我用一个名为cameraHolder的ObjectEntity对象创建了一个摄影机,这样它就可以坠落并发生碰撞和所有其他情况 问题是当按下特定的WASD键时,cameraHolder应该会移动,但它只移动一个单元,不再移动。松开按钮时,它会将一个单元移动

我正在使用jBullet和OpenGL创建一个基本的游戏引擎。我创建了两个名为
ObjectSurface
ObjectEntity
的类。基本上,ObjectSurface没有质量,所以它们不会移动,ObjectEntity可以通过碰撞或重力移动

我用一个名为
cameraHolder
的ObjectEntity对象创建了一个摄影机,这样它就可以坠落并发生碰撞和所有其他情况

问题是当按下特定的WASD键时,
cameraHolder
应该会移动,但它只移动一个单元,不再移动。松开按钮时,它会将一个单元移动到相反的方向,以便您处于同一位置。在
cameraHolder
移动后,相机的XYZ设置为
cameraHolder
XYZ坐标

但是,该运动适用于jBullet引起的运动,jBullet由于重力而下落

当我不使用jBullet更新时,相机会正常移动。所以问题应该出在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);
}
以下是物理世界是如何创建的:

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);
}
如何获取输入和更新物理(可疑代码在此部分):

公共静态向量3f重力=新向量3f(0,-10,0)//重力
私有ArrayList对象//游戏中的所有对象(CAMERAHOLDER在此)
//获取输入,使用CAMERA类中的move()方法移动支架。
public void getInput(){
if(键盘.isKeyDown(键盘.KEY\u l控制))
速度乘数=3;
if(键盘.isKeyDown(键盘.KEY_W))
cam.move(cam.getMoveSpeed()*速度倍增器,摄像头.向前移动);
if(Keyboard.isKeyDown(Keyboard.KEY_))
cam.move(cam.getMoveSpeed()*速度倍增器,Camera.move_向后);
if(键盘.isKeyDown(键盘.按键A))
cam.move(cam.getMoveSpeed()*速度倍增器,Camera.move_左);
如果(键盘.isKeyDown(键盘.keyd))
cam.move(cam.getMoveSpeed()*速度倍增器,Camera.move_RIGHT);
cam.carryCamera();//将实际相机移动到支架上。
速度乘数=1;
}
公共无效更新(){
applyJBullet();
}
//这里应用了JBULLET物理(可疑代码!!!)
public void applyJBullet(){
Engine.getDynamicsWorld().stepSimulation(1/60.f,10);//模拟下一帧
对于(对象o:objects){
如果(o.getMass()>=1){//将找到所有具有质量的对象
Transform trans=新变换();//创建新变换
o、 getBody().getMotionState().getWorldTransform(trans);//获取模拟位置
//当我这样做:“trans.origin.x+=2”时,它仍然不起作用。同样的问题也发生了。
o、 setPos(trans.origin);//并将其设置为对象位置
}   
}
}

我认为一个比仅仅使用长方体更好的原因是拥有一个运动的身体。转动相机主体 进入“运动学体”(最好是单向碰撞,由用户移动),调用以下命令:

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