我已经设置了一个相机,我可以用 WASD 移动并用鼠标旋转视图。但现在问题来了:我想为相机/播放器添加物理特性,以便它与我的其他 jBullet 对象“交互”。我怎么做?我考虑为相机创建一个 RigidBody 并将位置存储在那里,以便 jBullet 可以将其物理应用到相机。然后,当我需要改变某些东西(位置)时,我可以简单地在 RigidBody 中改变它。但是我没有找到任何编辑位置的方法。
你能把我推向正确的方向,或者给我一个示例源代码吗?
在您阅读此答案之前,我想提一下,我对答案中所述的解决方案有疑问。您可以关注我关于该问题的问题,以便在使用此答案时也可以找到解决方案。
所以。首先,您需要创建一个新的 BoxShape:
CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);
并将其添加到您的世界中,以便它与所有其他对象交互。现在您需要更改有关相机移动(而不是旋转)的所有方法,以便这些方法移动您的cameraHolder
而不是您的相机。然后将相机的位置设置为cameraHolder
.
同样,如果您遇到无法正常移动的问题,可以查看我的问题并等待答案。您还可以找到更好的方法来执行此操作。
如果您有问题或不了解答案,请在评论中说明。
几天前我自己也在问同样的问题。我的解决方案正如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 坐标然后应用变换。
从这里开始,要移动相机,您可以设置刚体的线速度来移动相机或施加力。