DirectX - мощный инструмент для написания игр и программ, работающих с ЗО-графикой. С помощью мастера DirectX AppWizard или платформы физического моделирования можно избежать необходимости выполнять множество трудоемких операций по инициализации DirectX и освобождению ресурсов. Однако чтобы эффективно использовать DirectX, нужно понимать основы ее архитектуры и назначение ее компонентов. more…
Tags: Геометрия, инструменты, ИтогиArchive for » January, 2008 «
Если вы посмотрите на функцию AppMain () (листинг 2.3), то увидите, что она вызывает функцию InitD3D (), а затем позволяет игре выполнить дополнительную инициализацию. Для этого вызывается функция PostD3DI-nitialization О . Эту функцию должна предоставлять ваша игра.
Функция PostD3DInitialization() может выполнять все, что вы посчитаете нужным. Например, она может выводить заставку с названием и эмблемой издателя. Эта функция также может отображать основное меню игры, чтобы позволить игроку начать новую игру или загрузить ранее сохраненную.Когда выполнение функции PostD3DInitialization () завершается, она должна вернуть значение TRUE при успешном выполнении или FALSE при ошибке. Если вы не хотите, чтобы эта функция выполняла какие бы то ни было действия, сделайте так, чтобы она просто возвращала значение TRUE.
После вызова функции PostD3DInitialization {) функция AppMain () вызывает функцию Gamelnitialization (). Эта more…
Related posts
тела. Нужно просто рассматривать центр массы как материальную точку. Это просто. А как насчет вращательного движения?
Вероятно, вы не удивитесь, узнав, что с ним все гораздо сложнее. Давайте сначала разберемся с вращением двумерных твердых тел на плоскости -чтобы сделать это, нам не придется погружаться в замысловатую математику. Поскольку объекты могут двигаться только в одной плоскости, они могут вращаться только вокруг осей, перпендикулярных этой плоскости. На рисунке 9.4 показано твердое тело, ведущее себя таким образом.
Твердые тела, которые могут двигаться только в одной плоскости, встречаются весьма часто даже в ЗБ-играх. Если вы толкаете объекты по полу, их движение можно моделировать 20-механикой, если они не отрываются от поверхности. Шестеренки и колеса тоже можно представлять в виде двумерных твердых тел, если они не опрокидываются. Математика, необходимая для моделирования двумерных твердых тел, куда проще математики, необходимой для more…
Related posts
ИНИЦИАЛИЗАЦИЯ ОБЪЕКТА КЛАССА D3D_POlNT_MASS
Если вы просмотрите функцию Gamelnitialization () в файле Point-Mas sTest . срр, то увидите, что она инициализирует объект класса d3d_po-int_mass. Объявление этого объекта выглядит так:
d3d_point_mass theObject;
Оно расположено в начале файла.
Взгляните на листинг 7.8, чтобы увидеть, как в функции Gamelnitialization () инициализируется объект класса d3d_j?oint_mass.освещение для Direct3D. В строке 15 объявлена переменная типа D3DLIGHT9. Ее содержимое обнуляется вызовом функции Windows Zero-Memory () . В строке 16 источник света делается направленным. В строках 19-21 для определения вектора, задающего направление света, используется переменная типа D3DXVECTOR3. В строках 24-27 задается белый цвет света. В строке 28 Direct3D отдается указание использовать созданный источник света, а в строке 29 - включить этот источник. В строках 30-32 совмещением цветов света и материала шарика получается цвет, который будет отображаться на экране.
Ну что ж, все готово. У нас есть материальная точка с загруженной моделью. У нас есть источник освещения. Вероятно, можно было бы отпустить какую-нибудь кинематографическую шутку, но, к сожалению, я не могу вспомнить подходящую. Поэтому, пожалуйста, просто продолжайте читать.ОБНОВЛЕНИЕ МЕСТОПОЛОЖЕНИЯ ОБЪЕКТА КЛАССА D3D_POiNT_MASS
В ходе выполнения программы нужно заново вычислять местоположение материальной точки при рендеринге каждого кадра анимации. Как и в предыдущих главах, это делается в функции UpdateFrame (). Чтобы увидеть ее исходный код, взгляните на листинг 7.9.
Листинг 7.9. Функция UpdateFrame()
1 bool UpdateFrame{)
2 {
3 // Создаем матрицу отображения - как в предыдущих примерах.
4 D3DXVECTOR3 eyePoint(0.Of,3.Of,-5.Of);
5 D3DXVECTOR3 lookatPoint(0.Of,0.Of,0.Of) ;
6 D3DXVECTOR3 upDirection(0.Of,1.Of,0. Of) ;
7 D3DXMATRIXA16 viewMatrix;
8 D3DXMatrixLookAtLH(SviewMatrix, SeyePoint, SlookatPoint,
9 &upDirection);
10 theApp.D3DRenderingDevice()->SetTransform(D3DTS_VIEW,
11 SviewMatrix); 12
13 // Создаем матрицу проецирования - как в предыдущих примерах.
14 D3DXMATRIXA16 projectionMatrix;
15 D3DXMatrixPerspectiveFovLH(SprojectionMatrix,
16 D3DX_PI/4,1.0f,1.0f,100.Of) ;
17 theApp.D3DRenderingDevice()
18 ->SetTransform(D3DTS_PROJECTION, SprojectionMatrix); 19
20 //
21 // В течение одного интервала времени прикладываем к шарику
22 // силу.23 // Эта инициализация выполняется только один раз.
24 static bool forceApplied = false; 25
26 // Если сила еще не прикладывалась…
27 if (!forceApplied)
28 {
29 // Прикладываем силу.
30 theObject.Force(vector_3d(2.Of,0.0,0.0)) ;
31 forceApplied = true;
32 }
33 // Иначе сила уже прикладывалась…
34 else
35 {
36 // Присваиваем ей нулевую величину.
37 theObject.Force(vector_3d(0.0,0.0,0.0)) ;
38 ) 39
40 /* Задайте параметру значение между 0 и 1 для более
41 плавной анимации. */
42 theObject.Update(1); 43
44 return (true);
45 )
Функция OpdateFrame () начинается так же, как и аналогичные функции в предыдущих главах. Сначала она подготавливает матрицы, требующиеся Direct3D. Когда эти матрицы готовы, она один раз прикладывает к шарику силу, чтобы он начал двигаться. Чтобы сделать это, функция использует статическую переменную.
Возможно, вы знаете, что в С++ статические переменные в функциях инициализируются один раз — при первом вызове этих функций. После этого инициализация никогда не выполняется во второй раз. Использование статической переменной позволит нашей функции определить, прикладывалась ли уже к шарику сила. Если нет, то переменная forceApplied будет установлена в значение false. Поэтому оператор if, начинающийся в строке 27, задаст силу, действующую на шарик (строка 30). Кроме того, он установит переменную forceApplied в значение true.
Замечание
Обратите внимание, что сила действует в направлении увеличения значений по оси х. Поэтому шарик будет двигаться по экрану слева направо. Изначально он находится слева от области, видимой в окне программы. Когда программа запустится, он переместится по окну программы и исчезнет за его правым краем. После этого ничего нового в окне не отобразится, поэтому его можно закрыть.
Related posts
Объявив нужные ей переменные, функция InitD3D() создает объект Direct3D. Если объект успешно создается, то в строках 18-21 листинга 2.4 задаются параметры экрана. Если вы хотите более тщательно настраивать эти параметры, добавьте private-элементы данных в класс d3d_app. Добавьте в функцию InitApp () этого класса параметры, которые позволят вам присваивать значения новым элементам данных при вызове функции InitAppO. Затем перепишите код в строках 18-21 так, чтобы в структуру помещались значения этих элементов данных, и используйте эти значения для задания параметров экрана.
Затем функция InitD3D () пытается создать устройство Direct3D. Сначала она пытается использовать HAL в строках 27-30. Если это не удается, то она пытается использовать программную эмуляцию в строках 34-40.
Платформа делает несколько попыток инициализации, прежде чем сдаться. Это важно. Direct3D позволяет использовать аппаратные вершинные процессоры. Если в компьютере пользователя установлена видеокарта, возраст которой более трех лет, она, вероятно, не содержит вершинных процессоров. Если бы платформа не пыталась использовать more…
Related posts
Если Windows успешно создает окно программы, функция AppMain () вызывает функцию PreD3DInitialization(). PreD3DInitializati-on () - это еще одна функция, которая нужна платформе, но должна быть предоставлена вашей игрой. Если в игре не будет функции PreD3DIniti-alization(), ее не удастся скомпилировать. Эта функция предоставляет игре возможность выполнить все операции, которые ей нужно выполнить до инициализации Direct3D. Функция возвращает TRUE, если она выполнилась успешно, и FALSE, если нет. Если вашей игре не нужно выполнять никаких действий, прежде чем инициализировать Direct3D, функция PreD3DInitialization() должна просто возвращать TRUE.
Далее функция AppMain () инициализирует Direct3D, вызывая функцию платформы InitD3D (). Эта функция рассматривается в следующем разделе. Если InitD3D() удается инициализировать Direct3D, она возвращает значение more…
Related posts
Однако функция WinMain () принадлежит к глобальному пространству имен. Поэтому ее трудно сделать дружественной к классу d3d_app, принадлежащему к пространству имен pmframework. Платформе нужно, чтобы ее основная функция была дружественной. Дабы разрешить это противоречие, функция WinMain () не делает почти ничего. Вся функциональность, которая обычно находится в ней, перенесена в функцию AppMain (). Функция WinMain () вызывает AppMain (), и функция AppMain () выполняет всю работу. Функция WinMain () приведена в листинге 2.2.
Листинг 2.2. Функция WinMain() платформы физического моделирования
1 INT WINAPI WinMain(
2 HINSTANCE hlnstance,
3 HINSTANCE hPrevInstance,
4 LPSTR lpCmdLine, more…
Related posts
Чтобы избежать возни с кодом, сгенерированным мастером AppWizard, я написал аккуратную платформу, которая подготавливает Direct3D к работе. Она изолирует свой собственный код от вашего. Чтобы вызвать ваш код, платформа предоставляет стандартный набор функций для игры. Эти функции позволяют делать все, что нужно.
Замечание
Все функции платформы физического моделирования включены в пространство имен pmf ramework, поэтому нужно вставить оператор
use namespace pmframework;
в начало каждого файла . срр в вашей игре.
Весь исходный код платформы можно найти на компакт-диске, поставляющемся с книгой. Код находится в папке Source\Chapter02\ PMFramework. more…
Related posts
Интерфейс мастера DirectX AppWizard в Visual Studio 7 выглядит немного по-другому, но работает в основном так же, как и в Visual Studio 6.
1. В меню File выберите пункт New, а в открывшемся подменю -пункт Project. Visual Studio отобразит окно New Projects. В левой части этого окна есть список языков, которые поддерживает Visual Studio. Для каждого языка показан список типов проектов, которые можно создать. Щелкните на папке Visual С++ Projects, а затем выберите значок DirectX9 Visual С++ Wizard.
2. Введите имя проекта и щелкните на кнопке ОК.
3. В левой части появившегося довольно необычного диалогового окна содержится список вкладок. Справа от этого списка - пространство для отображения содержимого этих вкладок. Щелкните на ярлыке вкладки Project Settings. more…
