XNA: основные физики JigLibX
XNA себя, не проводятся занятия, чтобы помочь нам в расчет физики. Хотя это можно обнаружить те же столкновения, но это, как объекты ведут себя, когда он обнаружил, зависит только от кода, написанного нами. Если мы не будем использовать готовые библиотеки для служащих. Я взял самые популярные обои XNA'ową OpenSource библиотеке - JigLibX .
Чего можно достичь?
Говоря о кино авторам, два примера:
... И пример созданный теми же авторами JigLibX:
Больше видео на сайте проекта .
Создание проекта
Первое, что нужно сделать, это скачать из раздела Download, последний источник JigLibX'a. После распаковки, мы создаем новый проект (в моем случае XNA 3.1 Проект), нажмите на Обозреватель решений главный корень нашего проекта (решение NazwaNaszegoProjektu), щелкните правой кнопкой мыши и выберите Add> существующего проекта

Добавление существующего проекта к существующим
выберите папку, куда вы распаковали загруженные ранее физический движок: JigLibX> JigLibX.csproj.

Добавление существующего проекта к существующим
Если вы выбрали при создании проекта, проект XNA версии 3.1, вы должны теперь сделать проект модернизации JigLibX до версии 3.1. Мы делаем это, щелкнув правой кнопкой мыши на корне проекта JigLibX Решение обновления>. Мы делаем это, чтобы позже иметь возможность добавить проект основного проекта JigLibX'a ссылки. В противном случае, это не представляется возможным, так как в настоящее время он предназначен для версии 3.0. Изменения в версии 3.1 не являются достаточно большими, однако, чтобы полностью исправить библиотека работает по этой версии XNA.
Затем щелкните правой кнопкой мыши на корню наш главный проект (в моем случае он называется FizykaZJigLibX)> Добавить ссылку> Проекты> JigLibX. В дереве нашего проекта, папки, ссылки должны появиться JigLibX. Теперь у нас есть доступ к этому пространству имен.
Помимо физики системы
Во-первых, необходимо будет добавить соответствующие пространства имен в Game1.cs.
использование JigLibX.Physics; использование JigLibX.Geometry; использование JigLibX.Collision;
Таким образом, можно использовать классы написанные создателями JigLibX'a. Для начала, в конструкторе нашего класса, мы создаем два объекта.
общественных Game1 () { графика = новый GraphicsDeviceManager (это); Content.RootDirectory = "Содержание"; PhysicsSystem PhysicsSystem мир = новый (); CollisionSystemSAP world.CollisionSystem = новый (); }
Предметного мира, который PhysicSystem например, инициировать все необходимые переменные и контроллер будет ощущать события, происходящие в нашем приложении. События, связанные с физикой. В следующей строке, в CollisionSystem свойства, мы назначаем CollisionSystemSAP созданный объект, необходимый для обнаружения столкновений. Этот класс использует алгоритм "зачистка и черносливом" для обнаружения столкновений, которые в данном случае, будет достаточно, но если смотреть в папку, в столкновении проект JigLibX, мы видим, что мы можем воспользоваться другим готовых классов, используя различные алгоритмы, например, на основе на сетке (сетка). Если пропустить этот шаг, который мы не могли реагировать на столкновения, и объекты будут просто проходить мимо них без какой-либо реакции.
Вы должны сделать одну вещь, а именно, регулярно обновлять наш объект, который хранит логику физики. Чтобы сделать это, просто обновление методов, добавьте следующий код:
TimeStep = поплавок (поплавок) gameTime.ElapsedGameTime.Ticks / TimeSpan.TicksPerSecond; PhysicsSystem.CurrentPhysicsSystem.Integrate (TimeStep);
Потому что PhysicsSystem.CurrentPhysicsSystem является составной частью статической, она доступна из любой точки мира в нашем проекте, который, несомненно, повышает удобство этого решения.
Создание актер класса
Актер класса, это будет на самом деле служат для создания объекта, который будет устанавливать параметры, определяющие объект в нашем приложении, и которые необходимы для любых расчетов в столкновении с окружающей средой.
Давайте создадим класс BoxActor.cs, нажав на корень нашего проекта> Add> Класс ..

Создайте класс BoxActor.cs
Поместите следующий код в файл BoxActor.cs:
using System; использование Microsoft.Xna.Framework, используя Microsoft.Xna.Framework.Graphics, используя JigLibX.Math, используя JigLibX.Physics, используя JigLibX.Geometry, используя JigLibX.Collision; имен {общественный класс FizykaZJigLibX BoxActor: DrawableGameComponent {частных Vector3 положение, частные Vector3 масштаба, частные тела _body, общественные Кузов {get {return _body;}} частных CollisionSkin _skin, общественные кожи CollisionSkin {get {возвращение _skin;}} общественной BoxActor (Игра игрой, Vector3 положение, Vector3 шкале): базовая (игра) {this.position = положении; this.scale = масштабе;}}} BoxActor класс наследуется от класса DrawableGameComponent потому, что актер должен быть составлен на экране, поэтому мы можем видеть, что происходит. Поул-позиция содержит информацию о центральной точкой внутри коробки, а масштаб -. Его размеры тела следует понимать как переменную, которая хранит информацию о движении и вращении нашей кожи объект отвечает за обнаружение столкновений..
Создание тела и CollisionSkin
Следующим шагом будет добавление в конце конструктора класса BoxActor, следующий код:
_body = новый орган (); _skin = новый CollisionSkin (_body); _body.CollisionSkin = _skin;
Для _body переменную, присвоить экземпляр орган, который будет хранить основные сведения о состоянии, в котором находится объект. _skin Будет иметь информацию о "оболочки" нашего объекта, который будет создан на основе ранее установленных _body. Наконец, он по-прежнему установлен CollisionSkin свойство _body.
Теперь решать, какую форму будет иметь наш актер. Зависит от того, как он будет вести себя на сцене. Посмотрите на примитивы класса находится в Primitives JigLibX>.
В нашем случае мы хотим, чтобы наш объект ведет себя как коробки, так что мы используем этот класс Box, добавив следующий код в конце BoxActor конструктор класса.
Коробка = новый Box (Vector3.Zero, Matrix.Identity, масштабирование); _skin.AddPrimitive (коробка, новый MaterialProperties (0.8f, 0.8f, 0.7f));
В приведенном выше, мы создали новый объект класса Box, параметры которого в конструкторе означать: положение в центре нашей коробке, коробка ориентации (единичная матрица не означает вращение и т.д.), и масштаб, который будет установлен при создании объекта BoxActor.
Вторая линия, сталкивающихся с поверхностью, добавляет наш объект, так что он может взаимодействовать с другими объектами. Первым параметром является тип объекта, с которым мы имеем дело, второй параметр определяет поведение материала (трения и упругости).
Определение массы объекта
Для определения массы объектов, которые, кроме того, центр тяжести, будет меняться в зависимости от направления силы, которые будут влиять на этот объект, авторы JigLibX, создадим следующий метод, который был добавлен к классу BoxActor.
SetMass частных Vector3 (флоат-масса) { PrimitiveProperties primitiveProperties = новый PrimitiveProperties ( PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass, масса); плавать нежелательной; Vector3 ком; Матрица ИТ; Матрица itCoM; Skin.GetMassProperties (primitiveProperties, из мусора, из ком, из нее, из itCoM); Body.BodyInertia = itCoM; Body.Mass = хлам; ком возвращения; }
В конце конструктора того же класса, определить массу следующим образом:
Com = SetMass Vector3 (1.0f); И вот, когда дело доходит до принятия по массе нашего объекта
. Конечно, ничто не мешает, что во время применения, может изменить массу объекта.
Настройка прав Box'aw место
На данном этапе мы ставим перед собой коробки на предмет, который будет дан в конструктор при создании нашего актера. Это необходимо для того, чтобы соответствовать телу нашего учреждения, а также зоны конфликта в соответствии с той же целью было осуществить адекватный и реалистичный.
В конце BoxActor конструктор, добавить следующий код:
_body.MoveTo (должность, Matrix.Identity); _skin.ApplyLocalTransform (новый Transform (-ком, Matrix.Identity)); _body.EnableBody ();
В первой строке перемещает "тело" нашего актера на определенный элемент. Второй параметр метода MoveTo, указывает на ориентацию объекта.
Вторая строка устанавливает столкновения область, соответственно, центр тяжести собственности.
В последней строке, позволяет моделирования _body, а также актер. Эта строка необходима, так как моделирование по умолчанию отключена.
Сотворение мира.
Все настройки, связанные с рамки были установлены, так что вы можете создать мир. В конце конструктора в основной файл нашего Game1.cs проект, добавить следующий код:
fallingBox = новый BoxActor (это, новый Vector3 (5, 20, 5), новые Vector3 (2, 2, 2)); immovableBox = новый BoxActor (это, новый Vector3 (0, -5, 0), новый Vector3 (10, 10, 10)); immovableBox.Body.Immovable = true; Components.Add (fallingBox); Components.Add (immovableBox);
Компонент по-прежнему будут добавлены все методы в классе Game1:
BoxActor fallingBox; BoxActor immovableBox;
Первые две строки составляют наши актеры. Параметры в конструкторе, выступаем за: первое - Например, в котором актер создал, в данном случае, наше приложение основного класса Game1, второй - позиции, третьим параметром является размер элемента.
Третья строка означает, что второй объект неподвижен, и как видно из параметров, передаваемых в конструктор, то это будет намного выше (5 раз), чем первый объект.
Четвертая и пятая линия создан нами будет добавить объекты в набор компонентов, которые будут нарисованы автоматически игра класс, который наследует после вашего приложения.
Рисование
Обратимся теперь к последней стадии, то есть, отказавшись от результата на экране на самом деле довольно словами, вы рисуете сцену. Но, во-первых, мы должны добавить модель окна, которые мы используем в нашем проекте. Пример модели из инновационных игр , вы можете скачать здесь .
После распаковки файла и скопировать два содержащихся файлов (с модели и текстуры) должен быть в Solution Explorer, щелкните правой кнопкой мыши Содержимое папки (в нашем проекте) и выберите Add> Existing Item ... и выберите файл модели. FBX и Повторите шаг, выбрав файл с текстурой.
Класс BoxActor, создать новый метод, который будет загружать наши модели:

защита LoadContent коррекции недействительными () { Модель = Game.Content.Load ("boxModel"); }
и добавить на все методы этого класса, объявление переменной модели:
частная модель модель; Затем добавьте того же класса, следующим способом:
Матрица частных GetWorldMatrix () { возвращать Matrix.CreateScale (масштаб) * _skin.GetPrimitiveLocal (0). Transform.Orientation * _body.Orientation * Matrix.CreateTranslation (_body.Position); }
Он возвращает массив нашем сложном мире, который мы получаем путем умножения матриц в следующей последовательности: масштаб столкновения поверхности, а на самом деле угол, под которым он находится, "тело" объекта (угол), и положение "тело" объекта.
Нам нужно больше проекции и представление матриц, которые будут добавлять к основной класс приложения (в файле Game1.cs):
Матрица частных _view; общественных Matrix View { получать { _view вернуться; } } частные _projection Matrix; общественной матрицы проекции { получать { _projection возвращения; } }
В Game1 конструктор класса, давайте установим в конце матрицу проекции, добавив следующую строку:
Matrix.CreatePerspectiveFieldOfView _projection = ( MathHelper.ToRadians (45.0f) (Float) graphics.PreferredBackBufferWidth / (поплавок) graphics.PreferredBackBufferHeight, 0.1f, 1000.0f );
Я не буду описывать параметры матрицы проекции, потому что я предполагаю, что на данном этапе они вполне понятны, но если нет, то я приглашаю вас на эту статью на msdn'ie .
Слева мы создали матрицу вида, мы сделаем это в методе обновления Game1.cs файл, добавив следующие строки кода:
Matrix.CreateLookAt _view = ( новый Vector3 (0, 10, 20), fallingBox.Body.Position, Vector3.Up );
Эта линия приведет к центру экрана, там будет наш падающий объект. Во время падения, мы увидим, как, вступили в столкновения с объектом, который был обездвижен.
Наконец, нам остается добавить метод BoxActor Draw, который автоматически вызывается для этого объекта для рисования.
общественного недействительными коррекции Draw (GameTime GameTime) { BasicWorldGame игры = (BasicWorldGame) игры; Матрица [] = новое преобразование матрицы [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo (преобразование); WorldMatrix = GetWorldMatrix Matrix (); Еогеасп (ModelMesh сетки в model.Meshes) { Еогеасп (BasicEffect эффект mesh.Effects) { effect.EnableDefaultLighting (); effect.PreferPerPixelLighting = true; effect.World = преобразований [mesh.ParentBone.Index] * worldMatrix; effect.View = game.View; effect.Projection = game.Projection; } mesh.Draw (); } }
С первой линии, вы будете иметь доступ к просмотру и матрицы проектирования, создания ссылки на основной теме нашего приложения. Остальная часть кода, является типичным для предоставления объектов BasicEffect класса. Важно только, чтобы использовать мировой матрицы, матрица, которая рассчитывается в режиме реального времени, а на самом деле JigLibX рассчитывается для нас.
Статья основана на документацию, найденную здесь , но есть признаки того, что текст, содержащийся здесь является устаревшим, и написана мной версия должна работать лучше. Возможно, это связано с неполной совместимостью с XNA 3.1, но от того, что я смотрел на методы, один из них был сокращен с трех до двух параметров. JigLibX версии 0.3.1 (по состоянию на 11 сентября 2009 г.).
Готовый проект, чтобы загрузить (XNA 3.1) (2.1 MB)
Составитель демо (XNA 3.1) (0.3 MB)
Связанные записи
3 комментарий / с
очень интересная запись, не играйте с графиком, но я читал с удовольствием. Спасибо!
После моего монитора, тысячи людей в мире получают персональные кредиты от различных кредиторов. Таким образом, есть хорошие возможности, чтобы найти коммерческого кредита в каждой стране.




















































Ну, я вам скажу, что здесь не комментировать, размещать на высоком уровне, как обычно.