Навигация по сайту:
home
файлы
ссылки
уроки, примеры
форум




  Уроки, примеры


Урок 3

Использование матриц.
Если вы следовали моим урокам, то вы, наверное, уже можете нарисовать треугольник. Это здорово, но мало. Теперь вы можете научиться его, например, вращать. Для этого в Direct3d существует такая штука, называемая матрицей. Когда я первый раз услышал это слово, оно ничего мне не говорило, но через некоторое время я даже научился использовать их. И вы можете научиться.
Итак, в Direct3d существуют 3 основные матрицы: видовая (View), мировая (World) и проекционная (Projection). Начнем с первой. Видовая матрица характеризует положение камеры в пространстве. Вторая – положение объекта в пространстве. Третья – угол обзора и дальность прорисовки (лучше ее задать один раз и больше не менять).
Для работы с матрицами существует несколько функций:

D3DXMATRIX mat1, mat2, matres; //создание 3-х матриц
D3DXMatrixIdentity(&mat1); //обнуляет матрицу
D3DXMatrixRotationX(&mat1, angle); //создает mat1, повернутую на угол angle вокруг X
D3DXMatrixTranslation(&mat2, x1, y1, z1) //создает матрицу mat2 и помещает ее в (x1;y1;z1)
D3DXMatrixMultiply(&matres, &mat1, &mat2) //перемножает mat1 на mat2 и заносит все в matres

Перемножение – одна из основных функций. При ее использовании получившаяся матрица получается как бы комбинацие двух других. Т.е. если одна матрица была повернута, а другая – подвинута, то получившаяся матрица будет и повернута, и передвинута. Это – основные функции, больше вам пока не надо.
Теперь можно применить эти знания к, например, видовой матрице. Для этого найдите функцию Render и добавьте туда этот код (можно в самое начало, но не после рисования полигонов):

D3DXMATRIX matres;
D3DXMatrixRotationX(&matres, D3DX_PI/4);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matres);

Вот мы и задали видовую матрицу. Аналогично задается мировая матрица (только пишется D3DTS_WORLD). С проэкционной все немного сложнее:

D3DXMATRIX matres;
D3DXMatrixPerspectiveFovLH( &matres, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matres);

Это – наиболее стандартный способ задания проекционной матрицы. D3DX_PI/4 – угол обзора, 100.0f – дальность прорисовки.
Теперь, когда вы можете использовать матрицы, созданим простенький пример. Вот вид функции Render() (создайте глобальную переменную count):

Render()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
g_pd3dDevice->BeginScene();

D3DXMATRIX mat;
D3DXMatrixPerspectiveFovLH( &mat, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &mat);
count+=0,00001f
D3DXMatrixRotationX(&mat, count);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat);
D3DXMatrixIdentity(&mat)
g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat);

// рисование примитивов


// рисование примитивов закончено

g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

Этот вариант функции Render будет вращфть камеру вокруг оси X. Вот и все.
урок 1
урок 2
урок 3
урок 4


Сайт создан в системе uCoz