С небольшим количеством заданного кода трудно сказать наверняка.Но похоже, что вы жестко закодировали оси вращения в своем методе обновления.Суть вращений (представленных кватернионами или матрицами) заключается в том, что их умножение не является «коммутативным», то есть выполнение одних и тех же двух вращений, но в противоположных порядках, не дает одинакового результата.
Похоже, что вы 'Если предположить, что камера обращена в направлении (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).Это вращение вокруг той же оси, на которой вы смотрите, и эффект будет вращением.
Решает ли это проблему?Если это так, вам следует кодировать оси вращения относительно текущего направления камеры.