我已经设置了一个相机,我可以移动WASD和旋转视图与鼠标。但现在出现了一个问题:我想在相机/播放器中加入物理元素,这样它就可以与我的其他jBullet对象“交互”。我该怎么做?我考虑为相机创建一个RigidBody,并将位置存储在那里,这样jBullet就可以将其物理应用到相机上。然后,当我需要更改某些东西(职位)时,我可以简单地在RigidBody中更改它。但我没有找到任何方法来编辑这个职位。
你能把我推向正确的方向或者给我一个例子源代码吗?
发布于 2014-01-08 01:20:18
几天前我也问过同样的问题。我的解决办法就像Sierox说的那样。创建RigidBody of BoxShape并将其添加到DynaicsWorld中。要移动摄像机,向它的刚体施加力。我有阻尼设置为.999线性和角停止相机时,没有力,即玩家停止按下按钮。
我还使用了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(新的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坐标,然后应用变换。
从这里,要移动相机,你可以设定刚体的直线速度来移动相机或施加力。
发布于 2013-08-12 16:39:53
在你阅读这个答案之前,我想提一提,我对我在回答中所述的解决方案有一个问题。您可以跟踪my question关于这个问题,以便您也可以得到解决方案,如果您使用这个答案。
所以。首先,您需要创建一个新的BoxShape:
CollisionShape cameraHolder = new BoxShape(SIZE OF CAMERAHOLDER);并将其添加到您的世界,以便它与所有其他对象交互。现在,您需要更改所有关于相机移动(非旋转)的方法,这样这些方法就可以移动cameraHolder,而不是移动相机。然后将相机的位置设置为cameraHolder的位置。
同样,如果您遇到无法正确移动的问题,可以检查my question并等待答案。你也可以找到一个更好的方法来做这件事。
如果您有问题或不理解的答案,请说明它作为一个评论。
https://stackoverflow.com/questions/17947123
复制相似问题