首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jBullet相机“保持架”不动

jBullet相机“保持架”不动
EN

Stack Overflow用户
提问于 2013-08-12 16:21:57
回答 1查看 191关注 0票数 1

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

我创建了一个带有ObjectEntity对象的照相机,名为cameraHolder,这样它就可以掉下来,并发生碰撞等等。

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

然而,该运动适用于由于重力而下降的jBullet所引起的运动。

当我不使用jBullet更新时,cameraHolder就会正常移动。因此,问题应该是jBullet更新。我将在代码中展示这一点。

问题:为什么cameraHolder只移动一个单元,然后当按下特定的WASD按钮时返回?

下面是Camera.java类中运动的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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); 
}

以下是物理世界是如何创建的:

代码语言:javascript
复制
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);
}

如何获取输入和更新物理(本部分中有可疑代码):

代码语言:javascript
复制
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
        }   
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-08-20 14:59:57

我认为比仅仅使用盒子形状更好的原因是要有一个运动体。若要将相机机身转换为“运动体”(更好的单向碰撞,由用户移动),请调用以下命令:

代码语言:javascript
复制
body.setCollisionFlags(body.ge­tCollisionFlags() | CollisionFlags.KINEMATIC_OBJEC­T);
body.setActivationState(Collis­ionObject.DISABLE_DEACTIVATION­);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18191957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档