gpt4 book ai didi

java - 使用 jBullet 的 LWJGL 第一人称相机

转载 作者:行者123 更新时间:2023-11-30 04:17:39 27 4
gpt4 key购买 nike

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

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

最佳答案

几天前我自己也问过同样的问题。我的解决方案正如Sierox所说。创建 BoxShape 的 RigidBody 并将其添加到 DynaicsWorld。要移动相机,请对其刚体施加力。我将线性阻尼设置为 0.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 返回我可能“扔”在屏幕上或携带的其他对象的 vector 。我希望我回答了你的问题,并且没有提供太多非必要的信息。我会尝试找到给我这个想法的来源。我相信是在 Bullet 论坛上。

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

很抱歉遗漏了该部分

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

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

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

关于java - 使用 jBullet 的 LWJGL 第一人称相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17947123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com