Я пытаюсь создать 3D-игру, используя исключительно LWJGL и Slick-util, и я намерен сделать ее игрой от первого лица, поэтому мне нужен способ навигации по карте с использованием 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 вызывает сильное увеличение горизонтальной скорости и т.д.
У меня есть ощущение, что это может быть связано с отсутствием всплывающего окна или толчка в матрице или с забывчивостью где-то инициализировать личность. Любая помощь будет оценена по достоинству. Заранее спасибо!