У меня есть кватернионная камера, написанная на C # (бессовестно взята из онлайн-урока). Я пытаюсь перевести положение камеры в мировом пространстве, которое представлено в виде вектора 3, в направлении, в котором камера «смотрит». Однако я хочу, чтобы камера оставалась на фиксированной высоте по оси Y (предположим, что камера никогда не будет «перевернутой», поскольку ее нельзя поворачивать, если смотреть вертикально вверх или вниз по оси Y).
Проще говоря, я хочу, чтобы камера вела себя аналогично камере в игре RTS, такой как Command & Conquer. Нажатие вперед должно сдвинуть вас «вверх» по карте, оставаясь на постоянной высоте над местностью. Моя наивная попытка, приведенная ниже, недостаточна, поскольку скорость камеры определяется углом, которым камера смотрит на мир.
var Y = mPosition.Y;
mPosition += mInverseViewMatrix.Backward * amount;
mPosition.Y = Y;
В приведенном выше примере mPosition - это вектор 3, представляющий мировую позицию. mInverseViewMatrix является инверсией матрицы представления.
Я использую XNA и C #, но, возможно, пригодится любой общий совет, касающийся кватернионных и векторных манипуляций.