Thursday, September 25th, 2008 | Author: admin

В строках 4-9 листинга 9.2 функция Gamelnitialization () подготавливает матрицу отображения. В строках 13-16 подготавливается матрица проецирования. Поскольку позиция наблюдения и перспектива не изменяются от кадра к кадру, их не нужно пересчитывать, как это обычно происходит в примерах программ, поставляемых с SDK DirectX. В нашем примере матрицы отображения и проецирования создаются только один раз и после этого не изменяются.
В строке 19 листинга 9.2 функция Gamelnitialization () загружает сетчатую модель, которая должна использоваться данным твердым телом. Это сетчатая модель тигра из SDK DirectX.
Инициализация объекта класса d3d_rigid_body начинается в строке 21. В строках 21-24 задаются вращательные характеристики тигра. Вероятно, вас интересует, откуда взяты значения вращательной инерции в строке 23. Они more…

Tags: Gamelnitialization, МАСШТАБИРОВАНИЕ, Применение

Related posts

Thursday, September 25th, 2008 | Author: admin

Центростремительному ускорению соответствует центростремительная сила. Эта сила заставляет частицу отклоняться от прямолинейной траектории движения. Если бы вы сидели на вращающейся частице, вы бы чувствовали, что на вас действует сила, сбрасывающая вас с частицы, действующая в направлении, обратном направлению центростремительной силы. Вы бы почувствовали эту силу, поскольку вы не прикреплены намертво к вращающейся частице, и ваше тело стремится двигаться по прямой. Сила, противодействующая центростремительной, называется центробежной (centrifugal force).
Вот краткий вывод формулы для нахождения центростремительного ускорения с помощью конечных разностей. За незначительный интервал времени At центростремительное ускорение изменяет направление вектора скорости частицы, но не его величину, как показано на рисунке 9.8. На рисунке изменение скорости из-за действия more…

Tags: centrifugal, Gamelnitialization, Применение

Related posts

Thursday, September 25th, 2008 | Author: admin

Все уравнения, которые мы только что рассмотрели, легко можно применить и для многомерных моделей. Взгляните на наше первое кинематическое уравнение:
dx
Если х - расстояние, пройденное вдоль оси х в двумерной декартовой системе координат, то это уравнение описывает скорость движения материальной точки вдоль оси х, как показано на рисунке 7.8. Движение вдоль оси у можно рассматривать независимо от движения вдоль оси х:
Если нам нужно работать в трех измерениях, точно так же можно записать и скорость движения вдоль оси z:
dz more…

Tags: centrifugal, Gamelnitialization, кинематика

Related posts

Thursday, September 25th, 2008 | Author: admin

Все это можно моделировать - но это сложно. Физики и программисты, занимающиеся физическим моделированием, обычно начинают с упрощения ситуации. Первый шаг - немного отодвинуться. На рисунке 7.2 мы видим то же движение, но в более мелком масштабе. Машина выглядит почти точкой. Все маленькие элементы уже незаметны. Соответственно, положение машины, описанное вектором в некоторой системе координат, - это достаточно хорошее представление ситуации.
Рис. 7.2. Та же машина, рассматриваемая издалека, может быть описана единственным вектором, определяющим ее положение в заданный момент времени
Когда я говорю о материальных точках, именно такую ситуацию я и имею в виду: мы игнорируем форму объекта, его повороты вокруг осей, его размеры, вообще все, что происходит внутри этого объекта, и концентрируемся только на его свойствах, влияющих на его местоположение.Одномерная кинематика more…

Tags: centrifugal, кинематика, Скорость

Related posts

Thursday, September 25th, 2008 | Author: admin

Изменения в UpdateFrame () вносить не обязательно, хотя в программе на компакт-диске вращение пирамиды и движение позиции наблюдения замедлено. В листинге 5.3 приведена новая функция UpdateFrame ().
Листинг 5.3. Незначительные изменения в функции UpdateFrame()
1 bool UpdateFrame() more…

Tags: кинематика, ОБНОВЛЕНИЕ, Скорость

Related posts

Friday, September 05th, 2008 | Author: admin

Полицейский поправляет солнечные очки и подходит к остановившейся машине. Водитель машины вздыхает и опускает окно, начиная ритуал. Полицейский заявляет: «Сэр, знаете ли вы, с какой скоростью вы ехали?» Водитель качает головой, и полицейский продолжает: «Больше 100 миль в час». Водитель возражает: «Но я ехал всего 20 минут! Как я мог проехать 100 миль в час, если я ехал меньше часа?»
Что может ответить на это полицейский? Ну, в общем-то, полицейский не обязан это делать, но знающий физику полицейский мог бы ответить: «Это значит, что если бы вы ехали с этой скоростью целый час, вы бы проехали 100 миль». Водитель отпирается: «Но я тормозил и снижал скорость, и если бы я продолжал ехать, я бы проехал меньше 100 миль!»
Замечание more…

Tags: ОБНОВЛЕНИЕ, производная, Скорость

Related posts

Saturday, August 30th, 2008 | Author: admin

Этаглава посвящена одной из основных тем классической физики: движению материальных точек. Это обширная тема, и ее знание позволяет реализовать некоторые весьма впечатляющие эффекты, но это знание даст нам еще и возможность перейти к работе с твердыми и деформируемыми телами. Кроме того, в этой тлавФ вы познакомитесь с несколькими силами, моделирование которых нам понадобится и даст возможность сильно увеличить реалистичность игр. Кроме того, в этой главе изложены начала математического анализа. Вперед!
Материальные точки more…

Tags: Динамика, ОБНОВЛЕНИЕ, производная

Related posts

Monday, August 25th, 2008 | Author: admin

Опытные программисты, хорошо знающие язык С++, заметят, что можно и не объявлять элементы данных класса mesh_data как public. Их можно объявить как private и создать встраиваемые (inline) public-методы доступа к ним. Использование этих методов позволит избежать снижения скорости при доступе к данным. Это правда. Компилятор С++ подставляет код встраиваемых методов в места их вызова, примерно так же, как препроцессор - макрокоманды в программах на С.
Если вы реализуете класс с подсчетом ссылок более сложный, чем класс mesh_data, я настоятельно рекомендую создать public-методы доступа к его элементам данных, а сами элементы данных объявить как private. Хотя код станет несколько более объемным, он будет надежнее, а использование встраиваемых методов не приведет к снижению more…

Tags: Динамика, Предупреждение, производная

Related posts

Wednesday, August 20th, 2008 | Author: admin

Как уже упоминалось, в игре одна и та же модель может использоваться для создания нескольких экземпляров объектов. Чтобы позволить такое использование класса d3d_mesh, в нем реализован подсчет ссылок.Чтобы не хранить данные модели в классе d3d_mesh, данные хранят во вспомогательном классе mesh_data. В классе d3d_mesh есть динамически выделяемый объект класса mesh_data. На один и тот же объект mesh_data может ссылаться несколько объектов d3d_mesh, и объект mesh_data отслеживает все объекты d3d_mesh, указывающие на него, как показано на рисунке 6.3.
На рисунке 6.3 показаны три объекта d3d_mesh, в которых есть указатели, изображенные в виде стрелок. Все три объекта обращаются к одним и тем же данным, и их указатели указывают на один и тот же объект mesh_data. В объекте mesh_data есть элемент referenceCount, в котором хранится количество объектов d3d mesh, ссылающихся на этот объект.Чтобы понять, как выполняется подсчет ссылок, для начала еще раз посмотрим на определение класса d3d_mesh. Для удобства оно повторено ниже в листинге 6.4. more…

Tags: D3d, Динамика, Предупреждение

Related posts

Wednesday, August 20th, 2008 | Author: admin

Метод d3d_mesh: :Load() может загрузить не любую сетчатую модель Di-rect3D, которая может храниться в Х-файле. Он загружает только простые сетчатые модели, которые мы будем использовать в оставшейся части книги. За дополнительной информацией об Х-файлах и загрузке моделей обратитесь к литературе. Я рекомендую книгу Wolfgang F. Engle «Beginning Direct3D Game Programming* (издательство Premier Press). Это одна из немногих книг, в которой подробно разбираются Х-файлы и их применение.
Рендеринг сетчатой модели в классе d3d_mesh
Рендеринг модели значительно проще, чем ее загрузка. Как уже говорилось ранее, модели состоят из частей. Поэтому, чтобы выполнить рендеринг модели, программа должна перебрать все части модели и для каждой части выполнить следующие шаги:
1. Выбрать для части материал. more…

Tags: D3d, Load, Предупреждение

Related posts

Friday, August 15th, 2008 | Author: admin

Большая часть древних мыслителей Запада считала, что движущиеся объекты постепенно останавливаются. Это утверждение, на первый взгляд, подтверждается практикой. Если вы хоть раз передвигали мебель, вы готовы будете поклясться, что движение в данный момент времени не гарантирует движения в последующие моменты. Однако у древних мыслителей были сомнения в правильности этой теории. Они видели несоответствие теории и практики и пытались выяснить причины этих несоответствий.
Галилей предложил хорошую альтернативу этой теории, назвав ее принципом инерции. Его теория утверждает, что объект, движущийся по прямой линии с постоянной скоростью, будет продолжать двигаться вечно, если на него не действуют другие объекты. Создание такой теории потребовало хорошего воображения - почти все предметы вокруг нас постепенно останавливаются, если их постоянно не подталкивать. Однако Галилей понял, что это постепенное замедление движения вызвано трением между объектами, а не свойственно самим объектам. more…

Tags: D3d, Динамика, Силы

Related posts

Friday, August 15th, 2008 | Author: admin

Первое, на что стоит обратить внимание в методе Load(), - данные сохраняются в объекте класса mesh_data. Как я уже говорил, это делается для подсчета ссылок, который мы рассмотрим немного позже.
У метода Load () есть единственный параметр — имя Х-файла, из которого загружается модель. Объявив некоторые нужные ему переменные, метод Load() вызывает функцию D3DXLoadMeshFromX(), чтобы загрузить Х-файл (строки 7-15 листинга 6.2). Если файл успешно загружен, метод получает указатель на буфер материалов в строках 21-23.
Далее метод Load() выделяет массив структур материалов в строках 30-31. Если выделение массива проходит успешно, метод перебирает все материалы в списке в строках 58-91. В теле цикла метод копирует данные о материалах из буфера в массив материалов в текущем объекте. При этом цвет в рассеянном свете задается равным цвету в свете more…

Tags: D3d, D3DXLoadMeshFromX, Силы

Related posts

Sunday, August 10th, 2008 | Author: admin

Обратите внимание, что, когда машина начинает тормозить, расстояние, которое она преодолевает за единицу времени, начинает уменьшаться. Когда машина остановилась, не важно, сколько еще пройдет времени — пройденное расстояние увеличиваться не будет.
Попробуем определить скорость машины в какой-то момент времени. Первое приближение такой скорости можно получить, выбрав At, располагающееся в районе точки, для которой мы хотим узнать скорость. Взгляните на рисунок 7.5. С помощью графика мы можем найти расстояние, пройденное в начале и в конце интервала At. Разница между этими расстояниями и есть Ах. Средняя скорость в интервале времени At как раз и будет равна Дх / At.
Как видите, между средней скоростью и скоростью, измеренной в какой-то момент, есть весьма существенное различие - сравните наклон исходной линии и наклон линии, которую мы использовали, чтобы получить приближенную оценку. Наклон линии равен изменению вертикальной координаты, деленному на изменение горизонтальной координаты. У more…

Tags: At, D3DXLoadMeshFromX, Силы

Related posts

Sunday, August 10th, 2008 | Author: admin

Класс d3d mesh
Вся описанная выше функциональность есть в классе d3d_mesh. Этот класс может загружать, отображать и очищать сетчатые модели.
Кроме того, класс d3d_mesh поддерживает возможность, необходимую для большинства игр. Часто в играх отображается множество экземпляров одинаковых объектов. Поиграйте в трехмерную «бродилку». На стенах лабиринта есть факелы? В памяти на самом деле находится только одна модель факела, которую игра использует для отображения всех факелов.
В классе d3d_mesh есть специальные элементы, позволяющие использовать в сцене одну и ту же модель много раз. Мы рассмотрим эти элементы подробно в разделе «Подсчет ссылок в классе d3d_mesh» далее в этой главе.
Определение класса d3d_mesh приведено в листинге 6.1. more…

Tags: At, Силы, факела

Related posts

Tuesday, August 05th, 2008 | Author: admin

Загрузить сетчатую модель довольно просто - это делает функция D3DXLoadMeshFromX (). Эта функция создает буферы для хранения материалов и текстур, которые хранятся в Х-файле. Прежде чем можно будетзагрузить модель, нужно объявить указатели на буфер материалов и интерфейс модели и создать переменную типа DWORD для хранения количества материалов:
LPD3DXMESH theMesh;
LPD3DXBUFFER materialsBuffer = NULL; DWORD numMaterials = 01;
Теперь можно загрузить модель в память:
D3DXLoadMeshFromX( meshFileName, D3DXMESH_MANAGED, d3dDevice, NULL, more…

Tags: At, модели, факела

Related posts

Wednesday, July 30th, 2008 | Author: admin

Применяя текстуру, DirectX заполняет ею поверхность полигона с помощью интерполяции. Элементы растрового изображения называются пикселями (pixel), а элементы текстуры называются текселями (texel). Интерполяция сводится к назначению текселя каждой ячейке на поверхности многоугольника.
Рис. 6.2.
Посмотрите на рисунок 6.2. У изображенного на нем треугольника есть три вертекса. Верхнему вертексу присвоены текстурные координаты (0, 0), поэтому на него накладывается компонент (0, 0) текстуры с рисунка 6.1. У правого вертекса текстурные координаты равны (1, 1), а у левого вертекса - (0, 1). После задания текстурных координат текстура накладывается на поверхность с помощью интерполяции. more…

Tags: Динамика, Столкновения, треугольник

Related posts

Friday, July 25th, 2008 | Author: admin

Попробуем найти момент инерции относительно центра масс для тела, изображенного на рисунке 9.11. Это твердое тело состоит из трех элементов: двух однородных сфер и обруча, расположенных так, как показано на рисунке. Масса каждой сферы равна 200 кг, а радиус -1м. Радиус обруча - тоже 1 м, а его масса - 100 кг. Все твердое тело может двигаться только в одной плоскости, поэтому мы будем рассматривать его как двумерное.Теперь с помощью теоремы Гюйгенса можно найти моменты инерции каждого элемента тела относительно оси, проходящей через центр массы тела. Расстояния от центра массы каждого элемента до центра массы тела приведены в таблице 9.1.Нам понадобятся моменты инерции каждого элемента относительно его центра массы. Момент инерции однородной сферы относительно любого диаметра равен (2/5)MR2, поэтому момент инерции каждой сферы равен 80 кг»м2. Момент инерции обруча more…

Tags: ГЮЙГЕНСА, Столкновения, треугольник

Related posts

Friday, July 25th, 2008 | Author: admin

Все, что мы сделаем с Х-файлами, - найдем несколько моделей и загрузим их. Можно создать Х-файл собственными силами в программе ЗО-моделирования или скачать его с сайта, на котором доступны бесплатные модели. Пример - раздел Free Stuff сайта http://www.3DCafe.com.В Х-файле содержится сетчатая модель. Также в нем могут храниться текстуры и данные о материалах. Прежде чем мы сможем загрузить сетчатую модель, нужно понять, как используются текстуры и материалы.

Текстуры - это растровые рисунки, которые можно наносить на поверхность треугольника как обои. В умелых руках текстуры могут здорово улучшить вид модели. Если вы посмотрите на большинство персонажей игр, то убедитесь, что большая часть глубины и структуры этих персонажей определяется не количеством вертексов в их моделях, а использованными текстурами. Именно текстуры создают впечатление правдоподобия персонажа. Если вы умеете more…

Tags: ГЮЙГЕНСА, Столкновения, Текстуры

Related posts

Sunday, July 20th, 2008 | Author: admin

Эта глава названа «Сетчатые модели и Х-файлы», но на самом деле она посвящена созданию моделей, выглядящих приемлемо. Моделирование физики в играх стало важным, когда достижения компьютерной графики позволили играм реалистично изображать объекты. Реалистичные объекты должны реалистично двигаться.
Вам вряд ли удастся создать множество реалистичных объектов, вписывая их прямо в программы в виде нескольких строк кода на С++. Вместо этого объекты создаются в ЗБ-редакторах, например, MilkShape3D фирмы chUmbaLum sOft, 3ds max фирмы Discreet или trueSpace фирмы Caligari. Затем созданные объекты преобразуются в формат, который можно использовать в игре.
Модели состоят из треугольников, поскольку треугольник - самая простая из возможных фигур на плоскости. Каждый треугольник образуется тремя вертексами. Все три вершины обязательно лежат в одной плоскости. Часть плоскости между вершинами (вертексами) треугольника называется поверхностью (face) этого треугольника. more…

Tags: ГЮЙГЕНСА, Текстуры, файлы

Related posts

Tuesday, July 15th, 2008 | Author: admin

Все три вектора должны храниться в матрице отображения. Вспомните - матрица отображения преобразует глобальные координаты в координаты камеры или координаты отображения. Функция UpdateFra-me () создает матрицу отображения в используемой DirectX левосторонней системе координат, вызывая вспомогательную функцию DirectX D3DXMatrixLookAtLH (). В строке 29 функция UpdateFrame () сохраняет матрицу отображения, чтобы DirectX применяла эту матрицу при рендеринге кадра.
Последняя операция, выполняемая функцией UpdateFrame (), - подготовка матрицы проецирования. Эта матрица подготавливается в строках 32-34. Как вы, вероятно, уже догадались, для подготовки этой матрицы тоже используется вспомогательная функция DirectX. Это функция D3DXMatrixPerspectiveFovLH (). Она создает матрицу проецирования, добавляющую перспективу и определяющую поле зрения в левосторонней системе координат DirectX. Эта матрица в строке 35 сохраняется для использования при рендеринге. more…

Tags: ГЮЙГЕНСА, КАДРА, файлы

Related posts