我已经安装了相机,我可以使用WASD移动并用鼠标旋转视图。但现在出现了问题:我想将物理添加到相机/播放器,以便它与我的其他jBullet对象“交互”。我怎么做?我想为相机创建一个RigidBody并在那里存储位置,以便jBullet可以将其物理应用到相机。然后,当我需要改变某些东西(位置)时,我可以简单地在RigidBody中更改它。但我没有找到任何编辑位置的方法。
你可以向我推动正确的方向,或者给我一个示例源代码吗?
答案 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坐标,然后应用变换。
从这里开始移动相机,你可以设置刚体的线速度来移动相机或施力。