Векторы поворотов 3D камеры тилинг

Надеюсь, простой ответ, но я не могу получить его.

У меня есть движок 3D-рендеринга, который я написал.

У меня есть положение камеры, положение взгляда и вектор вверх.

Я хочу иметь возможность "наклонять" камеру влево, вправо, вверх и вниз. Как камера на фиксированном штативе, которую вы можете взять за ручку и наклонить ее вверх, вниз, влево, вправо и т. Д.

Математика ставит меня в тупик. Я был в состоянии делать панорамирование вперед / назад и панорамирование вверх / вниз / влево / вправо, но не могу обработать векторную математику, чтобы заставить ее наклоняться.

Для наклона влево и вправо я хочу повернуть положение поворота вокруг положения камеры, но мне нужно учитывать вектор подъема, иначе вращение не знает, какую ось повернуть.

Математика / алгоритм, который мне нужен, в духе...

Камера = (cx, cy, cz) Lookat = (lx, ly, lz) Up = (ux, uy, uz)

RotatePointAroundVector (лк, LY, LZ, их, иу, UZ, сумма)

Кто-нибудь может помочь с математикой?

Большое спасибо.

3 ответа

Вы можете сделать точку перед камерой, затем повернуть ее вокруг камеры (используя триггер) и использовать lookat() для вращения камеры.

Это не сработает, когда вы начнете использовать крен (вращение вокруг Z). Так что вы можете создать класс камер на основе кватернионов. Эта ссылка помогла мне: gpwiki.org/Quaternion...

В основном вы визуализируете локальную систему координат для вашей камеры.

Локальный Z является вектором обзора (от центра камеры до точки обзора) и находится "на экране". Локальный Y будет вверх по экрану. Если вы сохраняете вектор наклона вашей камеры перпендикулярно вектору обзора камеры, то вектор наклона также является локальным Y. Локальный X будет нормальным к двум другим осям (это их перекрестное произведение после их нормализации).

Поворот влево-вправо - это поворот вращающегося вектора вокруг локальной оси Y (рыскание). Поворот вверх-вниз - это вращение вектора вверх и вектора подстановки вокруг локальной оси X (шага). "Наклон головы" влево-вправо - это вращение вектора вверх вокруг локальной оси Z (банка).

Каждый раз, когда вы меняете вектор подстановки или вектор поднятия, вам нужно пересчитывать локальные оси.

Это может быть не оптимально с математической точки зрения, но вы можете разложить камеру для просмотра вектора на три вектора - два, которые определяют горизонтальную плоскость, и вектор вверх.

Чтобы получить горизонтальную плоскость, вы можете получить один вектор в качестве перекрестного произведения вектора вверх и вектора приходящей-на-глаз. Затем вы можете получить другой ортогональный вектор, взяв скалярное произведение вверх и найденный вектор. Не забудьте нормализовать ваши три вектора.

Затем возьмите точечное произведение вашей камеры, чтобы посмотреть вектор с вашими тремя векторами, и теперь сделайте вращение вокруг горизонтальной плоскости (рассматривая ваши векторы, как если бы они были координатной осью).

Извините, что изложил все это словами. Надеюсь, это поможет.

Другие вопросы по тегам