Вторник, 17.06.2025, 20:41
Приветствую Вас Гость | RSS
Меню сайта
fff
  • Индексация
  • Девочки
    Форма входа
    Категории раздела
    Теория алгоритмов [3]
    Теория алгоритмов
    Code Snippets [1]
    Code Snippets
    Все о PHP [20]
    Все о PHP
    Visual C++ [13]
    Visual C++
    WIN32 API [7]
    WIN32 API
    Delphi [72]
    Delphi
    ASP [2]
    ASP
    Java [67]
    Java
    VBScript [6]
    VBScript
    CGI [2]
    CGI
    VRML [2]
    VRML
    PERL [9]
    PERL
    HTML [4]
    HTML
    XML [10]
    XML
    Архив записей

    Статьи по Оптимизации

    ПРОГРАММИРОВАНИЕ! СОЗДАНИЕ САЙТОВ И ИХ ОПТИМИЗАЦИЯ

    Главная » Статьи » Программирование » Visual C++

    Direct3dX - Использование матриц
    Direct3dX - Использование матриц
    Если вы следовали моим урокам, то вы, наверное, уже можете нарисовать треугольник. Это здорово, но мало. Теперь вы можете научиться его, например, вращать. Для этого в 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. Вот и все.

    Категория: Visual C++ | Добавил: Merlin (07.12.2009)
    Просмотров: 552 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *: