Поворот камеры с кватернионом - PullRequest
3 голосов
/ 09 ноября 2011

У меня проблема с математикой вращения камеры, скорее всего, мне не хватает знаний по этому вопросу, и я ничего не могу найти в Интернете (читай, скорее всего, не знаю правильных ключевых слов для поиска)

В любом случае, это то, что я пытаюсь сделать (псевдокод):

    RotateCamera(angle,axis){
        Quaternion rotation = cam.getRotation();
        Quaternion rot = new Quaternion();
        rot.fromAngleNormalAxis(angle, axis);

        rotation.multLocal(rot);

        cam.setRotation(rotation);
    }

    update(float value){ // just to show what input I use the RotateCamera method for the directions
        RotateCamera(value,Vector3f(0,1,0)) // left
        RotateCamera(-value,Vector3f(0,1,0)) // right
        RotateCamera(value,Vector3f(1,0,0)) // up
        RotateCamera(-value,Vector3f(1,0,0)) // down
    }

Теперь это работает довольно хорошо, но иногда камера катится вместо только рыскания / шага.Как правильно это сделать?

1 Ответ

4 голосов
/ 10 ноября 2011

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

Похоже, что вы 'Если предположить, что камера обращена в направлении (0,0,1), назовем это осью z, а ось y (0,1,0) выходит из макушки головы.Пока это предположение верно, ваша ось вращения для просмотра вверх, вниз, влево и вправо будет (1,0,0), (1,0,0), (0,1,0) и (0, 1,0) как они кажутся в вашем фрагменте кода.Но скажем, вы только что повернули на 90 градусов влево.Это отправляет изображение с камеры в направлении (0,0,1) в направлении (1,0,0).Теперь предположим, что вы делаете вращение «вверх», закодированное так, чтобы оно было вокруг оси (1,0,0).Это вращение вокруг той же оси, на которой вы смотрите, и эффект будет вращением.

Решает ли это проблему?Если это так, вам следует кодировать оси вращения относительно текущего направления камеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...