Камера
Контролеры камеры в Source SDK
Контролеры камеры расположены в нескольких исходных файлах, но большая часть их централизована в классе CInput (или CSDKInput). Большинство настроек и управление камерой доступны путем прямого редактирования методов класса CInput, или путем внесения ваших изменений в класс-заглушку CSDKInput. Имейте ввиду, что еслы вы напрямую отредактируете класс CInput, это может сильно усложнить обновление Source SDK; с другой стороны, если вы решили работать через класс CSDKInput, то вам придется переопределять и заменять большое число методов класса CInput.
Основные понятия
Прежде чем начать, мы должны рассмотреть, как представлена камера в движке. Положение и направление камеры обычно представлены как набор сдвигов координат относительно игрока. Вы можете считать что эти смещения являются набором указаний, говорящих как позиционировать камеру относительно положения игрока:
- Во-первых, вращение вокруг вертикальной оси с помощью смещения компоненты вектора yaw (он поворачивает камеру влево или вправо).
- Далее, поворот вокруг горизонтальной оси с помощью смещения компонента вектора pitch (он перемещает камеру вверх или вниз).
- Наконец, перемещение назад по направлению от текущего положения через компонент вектора distance.
Смещение камеры хранится в векторе m_vecCameraOffset. У вас есть доступ к компонентам pitch, yaw, и distance с помощью предустановленного набора значений (PITCH, YAW, и DIST) перечисления (enum) .
Соответствующие файлы
Основные файлы:
- game\client\iinput.h содержит расширение абстрактного класса CInput.
- game\client\input.h содержит главный класс CInput.
- game\client\in_camera.cpp содержит большинство расширений режима камеры от третьего лица.
- game\client\sdk\sdk_in_main.cpp содержит класс CSDKInput, который используется для переопределения функциональности класса CInput.
Дополнительные файлы:
- game\client\in_mouse.cpp содержит код специфичный для обновления смещения идеальной камеры (ideal camera) основанного на движении мышки в режиме от третьего лица.
Как работает камера от третьего лица
Класс CInput имеет полный доступ к вводу клавиатуры и мыши клиента. Он может использовать информацио о перемещении мышки для влияния на положение камеры. По перемещению камеры клиент обновляет переменные cam_idealpitch and cam_idealyaw для предоставления информации об идеальном положении камеры. Используя эту информацию, метод CInput::CAM_Think будет обновлять фактические смещения камеры для отслеживания перемещения мышки. Это отслеживание осуществляется с небольшим отставанием чтобы добавить красивый эффект слежения вместо немедленногой привязки к новой позиции.
Кроме того, метод CInput::CAM_Think осуществляет базовое определение столкновений с камерой, чтобы убедиться что камера не пробьет стену. Камеру будет автоматически перемещаться ближе к игроку в том случае, когда что-то лежит между игроком и позицией камерой.