Может кто-нибудь объяснить, как я могу использовать Quanternions, чтобы использовать мышь, чтобы выглядеть как FPS? - PullRequest
3 голосов
/ 25 апреля 2009

Вчера я спросил: Как простой вызов Pitch and Yaw может заставить камеру вращаться?

По сути, из-за «Gimbal Lock» я узнал, что, если вы наклонитесь и будете рыскать, вы неизбежно получите эффект переката. Для получения дополнительной информации вы можете прочитать этот вопрос.

Я пытаюсь предотвратить это. Когда вы смотрите в обычном FPS-шутере, ваша камера не катится повсюду!

Вот мой текущий функционал пассивной мыши:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

Что заставляет камеру отклоняться / рыскать в зависимости от движения мыши (удерживая курсор в центре). Я также разместил свой оригинальный класс камеры здесь .

Кто-то из этой ветки предложил мне использовать кватернионы, чтобы не допустить возникновения этого эффекта, но после прочтения на них страницы Википедии я просто не стал их грести.

Как я мог создать Quaternions в своем приложении OpenGL / Glut, чтобы я мог правильно смотреть вокруг своей «Камеры» без нежелательного поворота?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2009

Простая камера на основе кватернионов, разработанная для использования с gluLookAt. * ​​1001 *

http://www.gamedev.net/reference/articles/article1997.asp

1 голос
/ 21 мая 2009

Держите дельта-изменения на низком уровне, чтобы избежать этого (то есть <45 градусов) </p>

Просто рассчитайте небольшую «дельта» матрицу с поворотами для каждого кадра, сложите это в матрицу камеры для каждого кадра. (под складкой я имею в виду: cam = cam * delta)

Если вы работаете в течение длительного времени, вы можете получить некоторые числовые ошибки, поэтому вам нужно повторно ортогонализировать их. (посмотрите, если это кажется)

Это самый простой способ избежать блокировки карданного подвеса, просто играя с вещами. Как только вы станете более опытным, вы поймете все остальное.

Что касается кватернионов, просто найдите для них хорошую библиотеку, которая может преобразовать их в матрицы вращения, а затем используйте ту же технику (вычислите дельта-кват, умножьте на основной кват).

0 голосов
/ 25 апреля 2009

Вам не нужны кватернионы для этого простого случая, вам нужно ввести свой курс и высоту в расчете трехмерной матрицы:

  1. Используйте значение вашего курса с вращением по оси Y, чтобы вычислить МОЙ

  2. Используйте значение шага с поворотом по оси X для расчета MX

  3. Для каждой точки P вычислите R = MX * MY * P

Расчет можно выполнить двумя способами:

  1. T = MY * P, затем R = MX * T

  2. T = MX * MY, затем R = T * P

Первый способ медленнее, но сначала легче кодировать, второй - быстрее, но вам нужно будет закодировать функцию умножения матрицы на матрицу.

пс. См http://en.wikipedia.org/wiki/Rotation_matrix#Dimension_three для матриц

0 голосов
/ 25 апреля 2009

Я бы представлял все в полярных координатах . Страница Википедии должна помочь вам начать.

...