Вращение кватернионов на основе движения мыши (OpenGL и Java)

Я пишу игру на 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 со значением aw суммы, преобразованной в радианы (я предполагаю, что цель здесь состоит в том, чтобы задать ему угол, скажем, 10 градусов, и заставить его повернуть кватернион вдоль данной оси на это угол). Использование Quaternion.mul берет новый кватернион, умножает его на кватернион вращения, а затем сохраняет результат как кватернион вращения.Я не знаю, нужна ли нормализация, так как «гниль» - это нормально, а «вращение» уже должно быть нормализовано.

Методы 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-приложений ... хотелось бы, чтобы кто-нибудь сказал мне это, прежде чем я потратил много времени на их работу), но как только я переключившись на кватернионы, я быстро набрал .Я провел последние несколько месяцев, просто играя с этим кодом и читая о кватернионах, пытаясь заставить его работать, но я вообще ничего не добился: '(

Очень, очень разочаровывающе ... начинаю сожалеть пытаюсь создать что-то в 3D> _ <

5
задан TranquilMarmot 20 October 2011 в 21:21
поделиться