Jak prawidłowo obracać kwaternion wzdłuż całej osi?

Chcę zakodować kamerę pierwszej osoby z jej obrotem zapisanym w ćwiartce. Niestety coś jest nie tak z rotacją.

Następująca funkcja jest odpowiedzialna za obracanie kamery. ParametryMouse iSpeed przekazać ruch myszy i prędkość obrotową. Następnie funkcja pobiera ćwiartkę obrotu, obraca ją i zapisuje wynik. Przy okazji, używamBullet Physics to skąd pochodzą typy i funkcje.

void Rotate(vec2 Mouse, float Speed)
{
    btTransform transform = camera->getWorldTransform();
    btQuaternion rotation = transform.getRotation();

    Mouse = Mouse * Speed;                    // apply mouse sensitivity
    btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
    rotation = change * rotation;             // rotate camera by that

    transform.setRotation(rotation);
    camera->setWorldTransform(transform);
}

Aby zilustrować wynikowy obrót kamery, gdy mysz się porusza, pokazuję ci rysunek dłoni. Po lewej stronie pokazana jest niewłaściwa rotacja kamery. Po prawej stronie pokazana jest żądana prawidłowa obudowa. Strzałki wskazują, jak obraca się kamera podczas przesuwania myszy w górę (w kolorze pomarańczowym) i w dół (w kolorze niebieskim).

Jak widać, dopóki odchylenie jest równe zero, obrót jest prawidłowy. Ale im więcej ma odchylenia, tym mniejsze są koła, w których obraca się kamera. W przeciwieństwie do tego, okręgi powinny zawsze przebiegać wzdłuż całej kuli jak długość geograficzna.

Nie jestem zaznajomiony z czwartorzędami, więc tutaj pytam, jak je poprawnie obracać.

questionAnswers(2)

yourAnswerToTheQuestion