Уроки Коммент.

Создание игр » Новости » Игровая камера

Игровая камера

Игровая камераИгровая камера является неотъемлемым элементом любой игры. Камеры используются и в 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());

Собственно, вот и всё, что я хотел рассказать про камеру. Это лишь основа для создания в дальнейшем “нормальной” и полнофункциональной игровой камеры, но пока этого достаточно.

Проект с исходным кодом будет в следующем уроке.

Ещё по этой теме:




Раздел: Новости

4 комментариев на "Игровая камера"
  1. Byurrer пишет:

    Хорошая статья вот только бы исходник. Не знаю к месту иль нет … но у меня вопрос есть небольшой:
    вот сделал свой класс камеры, все в норме, однако если вращать камеру не только по оси X или Y то камера накренивается … и как выровнять не могу сообразить. Вызываю два метода: pitch и очередно.
    Вот класс камеры: http://narod.ru/disk/21010770001/camera.rar.html
    P.S прошу прощенья если не сюда но … просто я уже не знаю что делать.

    1. partworker пишет:

      у тебя не правильно работает код в матричных преобразованиях…
      про матрицы в DirectX тут почитать можно http://gamesmaker.ru/programming/directx/preobrazovaniya-matric-v-directx/

      кстати в 2д играх не всегда такая реализация камеры уместна.
      к примеру в изометрической игре очень удобно зная координаты i,j выводить объекты карты. Очень удобно, когда карта скажем из 1000 на 1000 квадратов, то вместо того чтобы пробегать по 1000000 клеток и объектов, проверяя попали в камеру или нет, просто берем сразу нужный диапазон i,j и рисуем

      в итоге карты получаются просто гигантские и ниче не глючит, да даже если не изоментрическая игра – то можно условно все равно разделить карту на такие сектора. Оптимизация сразу видно какая будет.

  2. Вячеслав пишет:

    Исходник есть в следующем уроке. Разберитесь с тем, как работают матрицы вообще и ваши проблем решатся – думаю, потому Вам на геймдеве ничего разумного и не ответили, что понимания основ будет вполне достаточно.

  3. Сергей пишет:

    А продолжение будет?
    Хотелось бы почитать про наклон, поворот, вращение.

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>