使用jBullet的LWJGL第一人称相机

时间:2013-07-30 12:31:52

标签: java opengl camera lwjgl jbullet

我已经安装了相机,我可以使用WASD移动并用鼠标旋转视图。但现在出现了问题:我想将物理添加到相机/播放器,以便它与我的其他jBullet对象“交互”。我怎么做?我想为相机创建一个RigidBody并在那里存储位置,以便jBullet可以将其物理应用到相机。然后,当我需要改变某些东西(位置)时,我可以简单地在RigidBody中更改它。但我没有找到任何编辑位置的方法。

你可以向我推动正确的方向,或者给我一个示例源代码吗?

2 个答案:

答案 0 :(得分:1)

在您阅读本答案之前,我想提一下我的答案中所述的解决方案存在问题。您可以关注该问题my question,以便在使用此答案时也能获得解决方案。

因此。首先,您需要创建一个新的BoxShape:

CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);

并将其添加到您的世界中,以便它与所有其他对象进行交互。现在您需要更改关于相机移动(而不是旋转)的所有方法,以便这些方法可以移动cameraHolder但不会移动相机。然后将相机的位置设置为cameraHolder

的位置

同样,如果您遇到无法正常移动的问题,可以查看my question并等待答案。你也可以找到一种更好的方法。

如果您遇到问题或对答案一无所知,请将其说明为评论。

答案 1 :(得分:1)

我几天前也在问自己同样的问题。正如Sierox所说,我的解决方案。创建BoxShape的RigidBody并将其添加到DynaicsWorld。要移动相机底座,请对其刚体施加力。我有阻尼设置为.999为线性,1为角度设置为没有施加力时停止相机,即播放器停止按下按钮。

我也使用body.setAngularFactor(0);所以这个盒子并没有在整个地方翻滚。同时将质量设置得非常低,以免过多地干扰其他物体,但仍能够跳跃然后进入它们,否则会受到它们的影响。

请记住将x,y和z坐标转换为笛卡尔平面,以便沿摄像机方向移动。即。

protected void setCartesian(){//set xyz to a standard plane
    yrotrad = (float) (yrot / 180 * Math.PI);
    xrotrad = (float) (xrot / 180 * Math.PI);
    float pd = (float) (Math.PI/180);
    x = (float) (-Math.cos(xrot*pd)*Math.sin(yrot*pd));
    z = (float) (-Math.cos(xrot*pd)*Math.cos(yrot*pd));
    //y = (float) Math.sin(xrot*pd);
}//..

public void forward(){// move forward from position in direction of camera
    setCartesian();
    x += (Math.sin(yrotrad))*spd;
    z -= (Math.cos(yrotrad))*spd;
    //y -= (Math.sin(xrotrad))*spd;
    body.applyForce(new Vector3f(x,0,z),getThrow());
}//..


public Vector3f getThrow(){// get relative position of the camera

    float nx=x,ny=y,nz=z;
    float xrotrad, yrotrad;
    yrotrad = (float) (yrot / 180 * Math.PI);
    xrotrad = (float) (xrot / 180 * Math.PI);
    nx += (Math.sin(yrotrad))*2;
    nz -= (Math.cos(yrotrad))*2;
    ny -= (Math.sin(xrotrad))*2;
    return new Vector3f(nx,ny,nz);
}//..

跳转只需使用body.setLinearVelocity(new Vector3f(0,jumpHt,0));并将jumpHt设置为您想要的任何速度。

我使用getThrow为其他对象返回一个向量" throw"在屏幕上或携带。我希望我回答了你的问题并没有提供过多的非必要信息。我会尝试找到给我这个想法的来源。我相信这是在子弹论坛上。

-------编辑------

很抱歉离开那部分

一旦您的刚体正常运作,您只需获取它的坐标并将其应用于您的相机,例如:

float mat[] = new float[16];

Transform t = new Transform();
t = body.getWorldTransform(t);
t.origin.get(mat);

        x = mat[0];
        y = mat[1];
        z = mat[2];

   gl.glRotatef(xrot, 1, 0, 0);  //rotate our camera on teh x-axis (left and right)
   gl.glRotatef(yrot, 0, 1, 0);  //rotate our camera on the y-axis (up and down)
   gl.glTranslatef(-x, -y, -z); //translate the screen to the position of our camera

在我的情况下,我使用OpenGL进行图形处理。 xrot和yrot表示相机的俯仰和偏航。上面的代码以矩阵的形式获得世界变换,并且出于摄像机的目的,您只需要拉动x,y和z坐标,然后应用变换。

从这里开始移动相机,你可以设置刚体的线速度来移动相机或施力。

相关问题