1

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

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

4

2 回答 2

1

在您阅读此答案之前,我想提一下,我对答案中所述的解决方案有疑问。您可以关注关于该问题的问题,以便在使用此答案时也可以找到解决方案。

所以。首先,您需要创建一个新的 BoxShape:

CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);

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

同样,如果您遇到无法正常移动的问题,可以查看我的问题并等待答案。您还可以找到更好的方法来执行此操作。

如果您有问题或不了解答案,请在评论中说明。

于 2013-08-12T16:39:53.207 回答
1

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

我也使用 body.setAngularFactor(0); 所以盒子不会到处翻滚。还要将质量设置得非常低,以免过多地干扰其他物体,但仍然可以跳上并撞到它们,否则会受到它们的影响。

请记住将您的 x、y 和 z 坐标转换为笛卡尔平面,以便您沿着相机的方向移动。IE

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 为我可能在屏幕上“投掷”或携带的其他对象返回一个向量。我希望我回答了你的问题并且没有提供太多非必要的信息。我会尝试找到给我这个想法的来源。我相信它在子弹论坛上。

- - - - 编辑 - - -

很抱歉遗漏了那部分

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

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 坐标然后应用变换。

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

于 2014-01-08T01:20:18.193 回答