Путешествие по поверхности сферы с использованием кватернионов - PullRequest
5 голосов
/ 29 октября 2010

Я программирую 3D-игру, в которой пользователь управляет камерой от первого лица, а движение ограничено внутренней поверхностью сферы. Мне удалось ограничить движение, но мне сложно понять, как управлять ориентацией камеры с помощью кватернионов. В идеале вектор «вверх» камеры должен быть направлен вдоль нормали сферы к ее центру, и пользователь должен иметь возможность свободно смотреть вокруг - как если бы мы всегда были на дне сферы, независимо от того, куда он движется.

Ответы [ 2 ]

5 голосов
/ 29 октября 2010

Предположительно, у вас есть два вектора, описывающих ориентацию камеры.Один из них будет вашим V'<sub>up</sub>, указывающим, какой путь вверх относительно ориентации камеры, а другим будет ваш V'<sub>norm</sub>, который будет указывать направление камеры.У вас также будет позиция <b>p'</b>, где ваша камера находится в какое-то время.Вы определяете каноническую ориентацию и положение, например:

<b>V<sub>up</sub></b> = <0, 1, 0>
<b>V<sub>norm</sub></b> = <0, 0, 1>
<b>p</b> = <0, -1, 0>

При заданном вращении кватерниона q вы затем применяете свое вращение к этим векторам, чтобы получить:

<b>V'<sub>up</sub></b> = q<b>V<sub>up</sub></b>q<sup>-1</sup>
<b>V'<sub>norm</sub></b> = q<b>V<sub>norm</sub></b>q<sup>-1</sup>
<b>p'</b> = q<b>p</b>q<sup>-1</sup>

В вашей конкретной ситуации вы определяете q, чтобы постепенно накапливать различные повороты, которые приводят к окончательному повороту, который вы применяете к камере.Эффект будет таким, что это будет похоже на то, что вы описываете.То есть вы перемещаете камеру внутри статически ориентированной и позиционированной сферы, а не перемещаете сферу вокруг статически ориентированной и позиционированной камеры.

Каждый шаг вычисляется путем поворота на некоторый угол θ вокруг вектора <b>V</b> = <b>V'<sub>up</sub></b> x <b>V'<sub>norm</sub></b>.

1 голос
/ 29 октября 2010

Кватернионы обычно используются, чтобы избежать блокировки карданного подвеса при движении в свободном пространстве (симуляторы полета и т. Д.). В вашем случае вам действительно нужен эффект карданного подвеса, поскольку камера, вынужденная оставаться в вертикальном положении, неизбежно будет вести себя странно, когда она должна указывать почти прямо вверх или вниз.

Вы должны быть в состоянии представить ориентацию камеры в виде пары широта / долгота, указывающей направление, в котором направлена ​​камера.

...