Листинг 2.15. Код отображения сцены

В программе рисование будет происходить по событию WM_PAINT.

Х, Y, Z, 1,

SZ, 0,

SY, 0, 0,

SX, 0, 0, 0,

X, Y, Z, 1,

Sin(b), 0, cos(b), 0,

0, 1, 0, 0,

Cos(b), 0, -sin(b), 0,

X, Y, Z, 1,

Sin(b), cos(b), 0,

Cos(b), -sin(b), 0,

1, 0, 0, 0,

X, Y, Z, 1,

0, 0, 1, 0,

Если необходимо произвести поворот против часовой стрелки, то нужно указать отрицательное значение угла.

X, Y, Z, 1,

0, 0, 1, 0,

Sin(b), cos(b), 0, 0,

Cos(b), -sin(b), 0, 0,

Рассмотрим способы, как можно поворачивать сцену

0, 0, 5, 1,

0, 0, 1, 0,

0, 1, 0, 0,

1, 0, 0, 0,

X Y Z 1

Float

Float

Float

Float

};

float m[4][4];

};

} D3DMATRIX;

Каждый элемент этой матрицы— это число, которое имеет определенный смысл.

Чтобы задать только Х-, Y- и Z-координаты точки расположения камеры с помощью матрицы вида её необходимо определить следующим образом:

Параметры камеры мы уже задали во время инициализации Direct3D с помощью функции SetTransform. Тогда первый параметр был равен d3dts_projection.

С помощью этой же функции SetTransform необходимо задать координаты расположения камеры, и тут первый параметр должен быть равен d 3 dts_view, а второй — это устанавливаемая матрица вида.


Для задания матрицы вида напишем функцию SetView, которая будет отодвигать камеру по оси Z на 5 единиц, т. е. элемент матрицы А43 будет равен 5. Вот как эта функция выглядит в виде кода:

void SetView() {

D3DMATRIX View = {

};

pD3DDevice->SetTransform(D3DTS_VIEW, &View);

}

Вот теперь мы сможем увидеть наш куб, поэтому можно переходить к его отображению.


1) Если необходимо повернуть сцену на угол b по часовой стрелке вокруг оси Z, то нужно установить следующую матрицу вида:

D3DMATRIX View = {

};

2) Допустим, что по оси X надо масштабировать сцену на значение SX, а по оси Y на значение SY. В этом случае матрица вида будет выглядеть следующим образом:

D3DMATRIX View = {

SX*cos(b), SX*-sin(b), 0, 0,

SY*sin(b), SY*cos(b), 0, 0,

};


3) Если же нужно повернуть сцену вокруг оси X, то используем матрицу вида следующего вида:

D3DMATRIX View = {

};

4) Для поворота вокруг оси Y используем матрицу вида:

D3DMATRIX View = {

};

5) Если необходимо просто масштабировать сцену, то используем следующую матрицу вида:

D3DMATRIX View = {

}

Эти матрицы преобразований получаются из математических операций над матрицами. Достаточно просто знать матрицы, которые приведены, и этого будет достаточно.


Отображение

case WM_PAINT:

// Очистка поверхности RECT r;

SetRect(&r, 0, 0, iWidth, iHeight);

pD3DDevice->Clear(1, (D3DRECT*)&r, D3DCLEAR_TARGET,

D3DCOLOR_XRGB(255,255,255), 1.0, 0);

// Подготовка изображения во вторичном буфере

pD3DDevice->BeginScene();

DrawScene();

pD3DDevice->EndScene();

// Отображение

pD3DDevice->Present(NULL, NULL, 0, NULL);

break;

1) Очищаем содержимое буфера, закрашивая его белым цветом;

2) Вызываем метод BeginScene. Этот метод всегда должен вызываться до формирования сцены, а после завершения создания сцены необходимо вызвать метод EndScene.

3) Создаём сцену;

4) После вызова метода EndScene мы отображаем сформированную сцену с помощью метода Present.


Вывод буфера вершин

Функция DrawScene создаёт сцену.

void DrawScene()

{

// Выставляем матрицу мира для объекта в мировых координатах

ViewAngle+=0.01;

float b = ViewAngle;

// Определение матрицы мира

D3DMATRIX World = {

(float)cos(b)*(float)cos(b), (float)cos(b)*(float)sin(b), (float)sin(b), 0,

(float)-sin(b), (float)cos(b), 0, 0,

(float)-sin(b)*(float)cos(b), (float)-sin(b)*(float)sin(b), (float)cos(b), 0,

0, 0, 0, 1,

};

// Устанавливаем матрицу мира

pD3DDevice->SetTransform(D3DTS_WORLD, &World);

SetView();

// Определяем вершинный формат

pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);

// Устанавливаем вершинный буфер

pD3DDevice->SetStreamSource(0, vBuffer, 0, sizeof(sVertex));

// Устанавливаем индексный буфер

pD3DDevice->SetIndices(iBuffer);

// убери отсюда комментарии, чтобы куб был в виде треугольников

// pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

// вывод объекта

pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, iVertsNum, 0, iPointsNum);

}


1) В переменную ViewAngle записываем значение угла, на который необходимо повернуть куб. Эта переменная будет автоматически увеличиваться после каждого обновления экрана. Результат расчетов заносится в переменную b, используемую для хранения угла, на который нужно повернуть куб.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: