Фон
Я пытаюсь создать FPS-игру на Java с использованием LWJGL 3.0.Я установил класс камеры, который имеет высоту и рыскание (рулон не используется).Сама камера расширяет Entity, так как у нее есть модель.Я хотел бы, чтобы эта модель всегда находилась «перед» камерой, куда бы она ни указывала.У каждой сущности есть метод getTransformationMatrix()
, который возвращает Matrix4f
, который затем передается в шейдер сущности.
Задача
Модель должна указывать в направлении камеры, а также вращаться вокруг камеры так, чтобы она всегда была впереди.Объект в этой ситуации - руки с пистолетом, как показано на фотографии ниже.
Моя попытка
Мне известна базовая тригонометрия, поэтому я получил объект для правильного вращения по высоте и рысканию по отдельности.Это моя текущая реализация:
Тяга
@Override
public Matrix4f getTransformationMatrix() {
modelX = getPosition().x + (radius * (float)Math.sin(Math.toRadians(getYaw())));
modelZ = getPosition().z + (radius * (float)Math.cos(Math.toRadians(getYaw())));
return Transform.createTransformationMatrix(new Vector3f(modelX, getPosition().y - 5, modelZ), new Vector3f(0, getYaw(), 0), getScale());
}
Высота
@Override
public Matrix4f getTransformationMatrix() {
modelZ = getPosition().z + (radius * (float)Math.sin(Math.toRadians(getPitch())));
modelY = (getPosition().y - 5) + (radius * (float)Math.cos(Math.toRadians(getPitch())));
return Transform.createTransformationMatrix(new Vector3f(getPosition().x, modelY, modelZ), new Vector3f(getPitch(), 0, 0), getScale());
}
Я провел некоторые исследования, ноЯ боюсь, что застрял на этом слишком долго и мне нужны свежие глаза.Когда я пытаюсь объединить эти два вычисления, модель, кажется, движется в форме графика, когда смотрит под любым углом рыскания, кроме 0. Ниже моя попытка объединить их:
@Override
public Matrix4f getTransformationMatrix() {
float zAxis = (radius * (float)Math.sin(Math.toRadians(getPitch())));
modelY = (getPosition().y - 5) + (radius * (float)Math.cos(Math.toRadians(getPitch())));
modelZ = getPosition().z + (zAxis * (float)Math.cos(Math.toRadians(getYaw())));
modelX = getPosition().x + (radius * (float)Math.sin(Math.toRadians(getYaw())));
return Transform.createTransformationMatrix(new Vector3f(modelX, modelY, modelZ), new Vector3f(getPitch(), getYaw(), 0), getScale());
}
Transform.createTransformationMatrix()
выглядит следующим образом:
public static Matrix4f createTransformationMatrix(Vector3f translation, Vector3f rotation, Vector3f scale) {
transform3d = new Matrix4f();
transform3d.setIdentity();
Matrix4f.translate(translation, transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.x), new Vector3f(1, 0, 0), transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.y), new Vector3f(0, 1, 0), transform3d, transform3d);
Matrix4f.rotate((float) Math.toRadians(rotation.z), new Vector3f(0, 0, 1), transform3d, transform3d);
Matrix4f.scale(scale, transform3d, transform3d);
return transform3d;
}
Мысли
Друг предложил создать единичный вектор, который указывает в направлении вверх (т.е. new Vector3f(0, 1, 0)
)вращение вектора на высоту и отклонение, затем умножение вектора на радиус и добавление его в положение камеры.Я попробовал это, но я не знаю, как повернуть Вектор на угол, и, похоже, в классе slick-utils Vector3f нет метода Vector3f.rotate()
.Любая помощь очень ценится, потому что в последние несколько дней у меня болит голова.Спасибо!