Кодируя некоторое время другие вещи, я в конечном итоге достиг точки, где я пытался разделить рендеринг, симуляцию и ввод.Из-за этого я пришел к следующему решению, которое работает для меня.Я не проверял это строго, но он, кажется, делает то, что я хочу (игнорируя поворот камеры) .
В андроидной части программы мне нужно было установить ориентацию на альбомнуюрежим:
<activity android:name=".MySuperAwesomeApplication"
android:label="@string/app_name"
android:screenOrientation="landscape">
>
Я создал класс игрока для хранения рыскания, тангажа, крена и позиции
public class Player {
public final Vector3 position = new Vector3(0,1.5f,0);
/** Angle left or right of the vertical */
public float yaw = 0.0f;
/** Angle above or below the horizon */
public float pitch = 0.0f;
/** Angle about the direction as defined by yaw and pitch */
public float roll = 0.0f;
}
А затем, когда я обновляю игрока на основе ввода, я делаю следующее:
player.yaw = -Gdx.input.getAzimuth();
player.pitch = -Gdx.input.getRoll()-90;
player.roll = -Gdx.input.getPitch();
Обратите внимание, что высота тона отображается на input.roll, а карты - на input.pitch.Не уверен, почему, но это работает для меня.Наконец обновите камеру:
camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = 0;
camera.up.y = 1;
camera.up.z = 0;
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 0;
camera.update();
// The world up vector is <0,1,0>
camera.rotate(player.yaw,0,1,0);
Vector3 pivot = camera.direction.cpy().crs(camera.up);
camera.rotate(player.pitch, pivot.x,pivot.y,pivot.z);
camera.rotate(player.roll, camera.direction.x, camera.direction.y, camera.direction.z);
camera.translate(player.position.x, player.position.y, player.position.z);
camera.update();
РЕДАКТИРОВАТЬ: добавлен рулон камеры к коду.Для меня и моего Droid 2, по-видимому, у рулона есть только значения в [-90,90], так что если вы поворачиваете на -90 или 90, значения начинают изменяться обратно к 0.