Создание игр » DirectX 9, Featured, Теория » Игровая камера
Игровая камера
Игровая камера является неотъемлемым элементом любой игры. Камеры используются и в 2д-играх, и в 3д. Бывают редкие исключения, но они скорее подтверждают правило. Например, камера может не использоваться в 2д- или 3д- играх при условии, что уровень игры полностью вмещается в экран – например, в тетрисе или “змейке” она обычно не используется. Но, в большинстве игр, она всё же присутствует. При этом следует понимать, что игровая камера служит не только лишь для задания той области игрового уровня, которая будет видна на экране – при помощи камеры происходит отсечение невидимых объектов, осуществляется навигация внутри игрового мира, в играх с большими уровнями отчасти именно камера определяет какие ресурсы должны подргужаться (стриммиться) с диска, именно к игровой камере чаще всего привязывается оружие игрока в шутерах и ещё много-много задач, для которых может использоваться игровая камера. Потому давайте уделим хотя бы немного времени на изучение того, как создаётся, задаётся и как используется игровая камера.
Класс игровой камеры
У нас уже есть база для создания всех игровых объектов – это класс CEntity, он содержит в себе такие параметры, как положение объекта в мире и его трансформацию. Именно от этого класса мы и унаследуем нашу игровую камеру, при этом камера будет иметь позицию в мере, а матрица трансформации будет как раз видовой матрицей нашей камеры, т.е. нам не придётся повторно реализовывать этот функционал. Единственное, что будет необходимо добавить это задание матрицы проецирования (как перспективной, так и ортографической) и несколько сервисных функций, которые упростят управление игровой камерой:
class CCamera : public CEntity { D3DXMATRIX m_matProj; public: CCamera(void); virtual ~CCamera(void); void SetModPerpective(float fFovY, float fZNear, float fZFar, float fAspect); void SetModOrtho(float fZNear, float fZFar, float fWidth, float fHeight); void GetView(D3DXMATRIX* pMatOut) const; const D3DXMATRIX GetView() const; void GetProjection(D3DXMATRIX* pMatOut) const; const D3DXMATRIX GetProjection() const; void GetViewProjection(D3DXMATRIX* pMatOut) const; const D3DXMATRIX GetViewProjection() const; }; |
Реализация этих функций абсолютно очевидна, потому приводить их код не буду. Если кому будет интересно – просто посмотрите в исходниках.
Использование игровой камеры
Использование созданной нами игровой камеры так же достаточно не сложно, вот код, который я написал для создания камеры и использования её в рендере нашего 3д-приложения:
// на этпе инициализации, в CTutorial3D::Init() m_camera.SetModPerpective(D3DX_PI*60/180, 1, 200, 800.0f/600.0f); m_camera.SetLookAt(D3DXVECTOR3(25, 75, 75), D3DXVECTOR3(0, 30, 0), D3DXVECTOR3(0, 1, 0)); // использование в рендере, т.е. в CTutorial3D::Render() m_pVertexShaderPhong->SetMatrix("mViewProjection", &m_camera.GetViewProjection()); m_pVertexShaderPhong->SetVector("vCam", &m_camera.GetPos4()); |
Собственно, вот и всё, что я хотел рассказать про камеру. Это лишь основа для создания в дальнейшем “нормальной” и полнофункциональной игровой камеры, но пока этого достаточно.
Проект с исходным кодом будет в следующем уроке.
Раздел: DirectX 9, Featured, Теория · Теги: Direct3D, Создание движка
Хорошая статья вот только бы исходник. Не знаю к месту иль нет … но у меня вопрос есть небольшой:http://narod.ru/disk/21010770001/camera.rar.html
вот сделал свой класс камеры, все в норме, однако если вращать камеру не только по оси X или Y то камера накренивается … и как выровнять не могу сообразить. Вызываю два метода: pitch и очередно.
Вот класс камеры:
P.S прошу прощенья если не сюда но … просто я уже не знаю что делать.
у тебя не правильно работает код в матричных преобразованиях…http://gamesmaker.ru/programming/directx/preobrazovaniya-matric-v-directx/
про матрицы в DirectX тут почитать можно
кстати в 2д играх не всегда такая реализация камеры уместна.
к примеру в изометрической игре очень удобно зная координаты i,j выводить объекты карты. Очень удобно, когда карта скажем из 1000 на 1000 квадратов, то вместо того чтобы пробегать по 1000000 клеток и объектов, проверяя попали в камеру или нет, просто берем сразу нужный диапазон i,j и рисуем
в итоге карты получаются просто гигантские и ниче не глючит, да даже если не изоментрическая игра – то можно условно все равно разделить карту на такие сектора. Оптимизация сразу видно какая будет.
Исходник есть в следующем уроке. Разберитесь с тем, как работают матрицы вообще и ваши проблем решатся – думаю, потому Вам на геймдеве ничего разумного и не ответили, что понимания основ будет вполне достаточно.
А продолжение будет?
Хотелось бы почитать про наклон, поворот, вращение.