Я пишу игру на Java, используя OpenGL (если быть точнее, привязку LWJGL).Каждая сущность, включая камеру, имеет кватернион, представляющий его вращение.Я понял, как применить кватернион к текущей матрице OpenGL, и все вращается просто отлично.У меня проблема в том, чтобы заставить камеру вращаться с помощью мыши.
Прямо сейчас, в каждом кадре игра захватывает величину, которую мышь переместила на одну ось, а затем применяет эту сумму к кватерниону.для вращения камеры.Вот код, который вращает кватернион, я выложу его, так как думаю, что именно в этом проблема (хотя я всегда ошибаюсь в такого рода вещах):
public void rotateX(float amount){
Quaternion rot = new Quaternion(1.0f, 0.0f, 0.0f, (float)Math.toRadians(amount));
Quaternion.mul(rot, rotation, rotation);
rotation.normalise();
}
Этот метод должен вращать кватернион вокруг оси X.'вращение' - это кватернион, представляющий вращение объекта.«количество» - это количество, на которое я хочу повернуть кватернион (или количество, на которое была перемещена мышь).'rot' - это нормализованный вектор вдоль оси X со значением w суммы, преобразованной в радианы (я предполагаю, что цель здесь состоит в том, чтобы дать ему угол, скажем, 10 градусов, и заставить его вращать кватернион вдоль заданной оси наугол).Использование Quaternion.mul берет новый кватернион, умножает его на кватернион вращения, а затем сохраняет результат как кватернион вращения.Я не знаю, нужна ли нормализация, так как 'rot' является нормальным, а 'вращение' должно быть уже нормализовано.
Методы rotateY и rotateZ делают то же самое, за исключением изменения вектора для rot'(0.0, 1.0, 0.0 для y и 0.0, 0.0, 1.0 для z).
Код работает нормально, когда игра начинается, и камера смотрит вниз по отрицательной оси Z.Вы можете вращаться полностью вокруг оси Y ИЛИ полностью вокруг оси X.Но как только вы пытаетесь повернуть камеру, не глядя вниз по оси Z, все становится действительно закрученным (я даже не могу это описать, оно очень странно вращается).
МойКонечная цель здесь состоит в том, чтобы иметь что-то, что можно использовать для управления кораблем в пространстве без восходящего вектора.Поэтому, когда вы перемещаете мышь по оси Y, независимо от того, под каким углом находится корабль, он меняет высоту корабля (вращение вдоль оси X).Точно так же, когда вы перемещаете мышь по оси X, она меняет рыскание (вращение вдоль оси Y).Я могу ошибаться в этом направлении, и мне, вероятно, просто нужен толчок (или толчок) в правильном направлении.
Если вам нужна дополнительная информация о чем-либо (как выполняется мой рендеринг, любые другие математические операции, которые япытаюсь сделать) просто спросите и я это смирю.Я все понял, когда использовал эйлеровы углы (которые, очевидно, являются большими запретами для разработки 3D-приложений ... хотелось бы, чтобы кто-нибудь сказал мне об этом, прежде чем я потратил много времени на то, чтобы заставить их работать), но как только япереключился на кватернионы, я быстро набрал 1020 .Я провел последние несколько месяцев, просто играя с этим кодом и читая о кватернионах, пытаясь заставить его работать, но на самом деле я вообще ничего не получил: '(
Очень, очень расстраивает ...начинаю жалеть, пытаясь что-то сделать в 3D> _ <</p>