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

Вчера я спросил: Как могло просто вызов "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, чтобы предотвратить этот эффект, но после прочтения страницы википедии на них я их просто не гляжу.

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


person KingNestor    schedule 25.04.2009    source источник
comment
Камера вращается не из-за блокировки кардана. Блокировка кардана происходит только в определенной ситуации. Как правило, во многих старых FPS (у большинства новых нет этой проблемы) вы не можете смотреть на небо под углом 90 °, чтобы избежать блокировки кардана, из-за которой ваш игрок будет смотреть только на небо в качестве если шея вашего игрока заблокирована. См. Статью в Википедии, чтобы получить дополнительную информацию об этом.   -  person rockeye    schedule 29.05.2009


Ответы (4)


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

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

person Don Neufeld    schedule 25.04.2009

Чтобы избежать этого, держите дельту на низком уровне (например, 45 градусов).

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

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

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

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

person Macke    schedule 20.05.2009

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

person Andy    schedule 25.04.2009

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

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

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

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

Расчет можно произвести 2 способами:

  1. T = MY * P, тогда R = MX * T

  2. T = MX * MY, тогда R = T * P

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

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

person winden    schedule 25.04.2009