Навигация по сайту: 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 |