【发布时间】:2015-01-07 02:03:05
【问题描述】:
我正在尝试仅使用 LWJGL 和 Slick-util 创建一个 3D 游戏,并且我打算让它成为一个第一人称游戏,所以我需要一种使用 3D 移动来导航地图的方法。我有一个位置Vector3f 和另一个向量acc 来存储加速度。我设置了以下方法,都(在另一个类中)绑定到 W、A、S 和 D:
public void walkForward()
{
acc.x += walkSpeed * (float) Math.sin(Math.toRadians(yaw)); // Calculations for 3D Movement (please correct me if wrong)
acc.z -= walkSpeed * (float) Math.cos(Math.toRadians(yaw));
}
public void walkBackward()
{
acc.x -= walkSpeed * (float) Math.sin(Math.toRadians(yaw));
acc.z += walkSpeed * (float) Math.cos(Math.toRadians(yaw));
}
public void strafeLeft()
{
acc.x += walkSpeed * (float) Math.sin(Math.toRadians(yaw - 90));
acc.z -= walkSpeed * (float) Math.cos(Math.toRadians(yaw - 90));
}
public void strafeRight()
{
acc.x += walkSpeed * (float) Math.sin(Math.toRadians(yaw + 90));
acc.z -= walkSpeed * (float) Math.cos(Math.toRadians(yaw + 90));
}
walkSpeed 是一个正浮点数。此外,在我的 move() 方法中,实际处理了运动,我有以下内容:
void move()
{
acc.y = 0.0f; // Keep the player's height stable, for testing purposes.
getPosition().x += acc.x; // Add current velocity to the position.
getPosition().y += acc.y;
getPosition().z += acc.z;
if(acc.x > 0.0f) // Gradually bring player's velocity to 0.
acc.x -= 0.01f;
else if(acc.x < 0.0f)
acc.x += 0.01f;
if(acc.y > 0.0f)
acc.y -= 0.01f;
else if(acc.y < 0.0f)
acc.y += 0.01f;
if(acc.z > 0.0f)
acc.z -= 0.01f;
else if(acc.z < 0.0f)
acc.z += 0.01f;
}
最后,在 render() 方法中,实际上对游戏进行了转换,我有这个:
public void render()
{
move();
glRotatef(pitch, 1.0f, 0.0f, 0.0f);
glRotatef(yaw, 0.0f, 1.0f, 0.0f);
glTranslatef(-position.x, -position.y, -position.z);
}
预期结果:普通 3D 运动、适当方向运动等
实际结果:玩家在大致方向移动,速度根据偏航和俯仰变化,释放所有键(调试确认没有接收到walk()方法的输入导致随机方向的抖动和奇怪的移动,其速度基于偏航和俯仰的变化,同时按住 W + A 或 W + D 会导致水平速度大幅增加,等等。
我有一种感觉,这可能是由于缺少矩阵中的弹出或推送,或者忘记在某处初始化身份。任何帮助,将不胜感激。提前致谢!
【问题讨论】:
标签: java opengl 3d lwjgl voxel