Перевод кватернионной камеры на фиксированную высоту - PullRequest
1 голос
/ 01 апреля 2011

У меня есть кватернионная камера, написанная на C # (бессовестно взята из онлайн-урока). Я пытаюсь перевести положение камеры в мировом пространстве, которое представлено в виде вектора 3, в направлении, в котором камера «смотрит». Однако я хочу, чтобы камера оставалась на фиксированной высоте по оси Y (предположим, что камера никогда не будет «перевернутой», поскольку ее нельзя поворачивать, если смотреть вертикально вверх или вниз по оси Y).

Проще говоря, я хочу, чтобы камера вела себя аналогично камере в игре RTS, такой как Command & Conquer. Нажатие вперед должно сдвинуть вас «вверх» по карте, оставаясь на постоянной высоте над местностью. Моя наивная попытка, приведенная ниже, недостаточна, поскольку скорость камеры определяется углом, которым камера смотрит на мир.

var Y = mPosition.Y;
mPosition += mInverseViewMatrix.Backward * amount;
mPosition.Y = Y;

В приведенном выше примере mPosition - это вектор 3, представляющий мировую позицию. mInverseViewMatrix является инверсией матрицы представления.

Я использую XNA и C #, но, возможно, пригодится любой общий совет, касающийся кватернионных и векторных манипуляций.

1 Ответ

1 голос
/ 01 апреля 2011

Я справился с этим двумя способами.

1) Используйте кватернион, чтобы вращать единичный вектор, указывая «вперед», чтобы он указывал в соответствующем направлении.Обнулить компонент y вектора.Повторно нормализовать вектор.Умножьте на скорость и добавьте к текущей позиции.

Отредактировано 2) Сделайте копию кватерниона.Обнулить компоненты x и z кватерниона.Повторно нормализуйте кватернион.Поверните единичный вектор на кватернион, умножьте на скорость и добавьте к позиции.Кватернионное представление вращения представляет собой модифицированное представление угла оси.Таким образом, если вы обнуляете части 'x' и 'z' оси, вокруг которой происходит вращение, то единственное оставшееся вращение - это 'yaw' вращение вокруг оси y (при условии, что 'вперед' выровнен с zОу).

...