В программе рисование будет происходить по событию 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, используемую для хранения угла, на который нужно повернуть куб.