O.Of. O.Of. - d*f/(f-d). O.Of
}:
//Два треугольника: ROOMVERTEX R_vertices[] -{
{ 400.Of. 1600.Of. 3000.Of. Oxff }. //A { -300.Of. 1900.Of. 3000.Of. OxffOOOO}. //B { -50.Of. 2100.Of. 3000.Of. OxffOOOO}. //C { 500.Of. 2000.Of. 4000.Of. OxffOO }. //D { -300.Of. 1900.Of. 2500.Of. OxffOOOO}. //E { -300.Of. 2000.Of. 2500.Of. OxffOOOO} //F
//Функция рисования, void RenderDX(HWND hWnd) {
Device->SetTransform(D3DTS_VIEW. &T); //Передача матриц Device->SetTransform(D3DTS_PR0JECTI0N. &Proj); //в конвейер. //Область просмотра и формат вершин установлены при инициализации. Матрица //проецирования не изменяется при перемещении наблюдателя. Ее тоже //следовало передать в конвейер один раз - при инициализации библиотеки. Deviсе->С1ear( 0. 0. D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER.
D3DCOLOR_COLORVALUE(0.0.0.9.0.9.0). l.Of. О ); Device->BeginScene(); //Вывод примитивов. Devi ce->DrawPri mi ti veUP(D3DPT_TRIANGLELIST.2.
&R_vertices.sizeof( ROOMVERTEX));
Device->EndScene();
Device->Present( NULL. NULL. NULL. NULL ); }
Исходный код модуля перемещения наблюдателя приведен в листинге 24.4.
Отображение трехмерной сцены
Листинг 24.4
#include <windows.h> #include <d3dx9math.h> extern D3DMATRIX T; float Alpha - 0.0; float XNab.YNab - 1800. ZNab;
float StepMen = 50.Of; //Шаг наблюдателя - минимальная величина перемещения за //такт моделирования.
float AngleMen - 0.01; //Угол поворота в радианах, void SetView(void)
//Данная функция формирует матрицу перевода мира в систему наблюдателя. {
static float Cos - l.Of.Sin - O.Of; Cos - cos(Alpha); Sin - sin(Alpha); T_ll - Cos:T._13 - -Sin; T_31 = Sin T_33 = Cos T_42 - -YNab:
T_41 - -XNab*T_ll-ZNab*T_31; T_43 - XNab*T_31-ZNab*T_ll; Г
Наблюдатель перемещается по сцене при помощи клавиатуры. Поэтому функцию Model Si mpl (i nt Key) необходимо вызывать при обработке сообщений WMJCEYDOWN, передавая ей код виртуальной клавиши. Код этой функции приведен в листинге 24.5.
Листинг 24.5
void Model Simpl(int Key) {
switch (Key) {
case VKJPACE: XNab - ZNab - Alpha - 0; break; case VK_UP: ZNab+ - StepMen; break;