Опубликован: 08.07.2007 | Доступ: свободный | Студентов: 1431 / 183 | Оценка: 4.43 / 4.02 | Длительность: 13:47:00
Специальности: Программист
Лекция 6:

Трехмерная графика с использованием Direct3D

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Например, поместить камеру в точку (0,0,-3) и направить "взгляд" наблюдателя в начало системы координат, можно с помощью такого кода:

C++
D3DXMATRIX matView;
D3DXVECTOR3 positionCamera, targetPoint, worldUp;

positionCamera = D3DXVECTOR3(0,0,-3);
targetPoint = D3DXVECTOR3(0,0,0);
worldUp = D3DXVECTOR3(0,1,0);
	
D3DXMatrixLookAtLH(&matView, &positionCamera, &targetPoint, 
  &worldUp);
device->SetTransform(D3DTS_VIEW, &matView);
Pascal
var matView: TD3DMatrix;
    positionCamera, targetPoint, worldUp : TD3DXVector3;
…
positionCamera := D3DXVector3(0, 0, -3);
targetPoint := D3DXVector3(0, 0, 0);
worldUp := D3DXVector3(0, 1, 0);

D3DXMatrixLookAtLH(matView, positionCamera, targetPoint, 
  worldUp);
device.SetTransform(D3DTS_VIEW, matView);

Таким образом, все объекты сцены будут теперь описаны в системе координат камеры (наблюдателя). Если положение и параметры камеры не меняются в течение работы приложения, то вызов функции SetTransform с параметром D3DTS_VIEW производится один раз.


Последним этапом преобразования при получении 2D изображения является операция проекции. Библиотека поддерживает работу как с перспективной, так и с ортогональной проекциями. Для работы с первым типом проекций предназначена функция D3DXMatrixPerspectiveFovLH(), для ортогональных же проекций нужна функция D3DXMatrixOrthoOffCenterLH(). Мы рассмотрим примеры работы с перспективной проекцией. Матрица перспективной проекции задает положение передней и задней отсекающих плоскостей, искажения, имитирующие перспективу. Прототип функции D3DXMatrixPerspectiveFovLH() приведен ниже.

D3DXMatrixPerspectiveFovLH(
matProj, // результат 
fov, // вертикальный угол обзора
aspect, // отношение ширины окна к высоте
zn, // расстояние до передней отсекающей плоскости
zf // расстояние до задней отсекающей плоскости
)

Ниже приведены иллюстрации, которые поясняют значение последних четырех аргументов данной функции.


Для установки перспективной матрицы необходимо вызвать метод SetTransform с первым параметром D3DTS_PROJECTION. Приведенный ниже пример, создает и устанавливает матрицу проекции со следующими параметрами: вертикальный угол обзора – 45 градусов, расстояние до передней и задней отсекающих плоскостей – 1 и 100 единиц соответственно.

C++
D3DXMATRIX matProj;

D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/2, 
  width/height, 1, 100);
device->SetTransform(D3DTS_PROJECTION, &matProj);
Pascal
var 
  matProj: TD3DXMatrix;

D3DXMatrixPerspectiveFovLH(matProj, pi/2, 
  Width/Height, 1, 100);
device.SetTransform(D3DTS_PROJECTION, matProj);

Если параметры проецирования не меняются в течение работы приложения, то вызов функции SetTransform с параметром D3DTS_PROJECTION выполняется единожды.

Таким образом, конвейер преобразований вершин объекта может быть описан следующей блок-схемой:


Каждая вершина трехмерной сцены подвергается следующему преобразованию V' = V*matWorld*matView*matProj, где V – исходная вершина, V' - преобразованная вершина.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >