Суботу 12. Верасень, 2009

XNA: асноўныя фізікі JigLibX

podstawy-jiglibx XNA сябе, не праводзяцца заняткі, каб дапамагчы нам у разлік фізікі. Хоць гэта можна выявіць тыя ж сутыкнення, але гэта, як аб'екты паводзяць сябе, калі ён выявіў, залежыць толькі ад кода, напісанага намі. Калі мы не будзем выкарыстоўваць гатовыя бібліятэкі для служачых. Я ўзяў самыя папулярныя шпалеры XNA'ową OpenSource бібліятэцы - JigLibX .

Чаго можна дасягнуць?

Гаворачы пра кіно аўтарам, два прыкладу:

... І прыклад створаны тымі ж аўтарамі JigLibX:


Больш відэа на сайце праекту .

Стварэнне праекта

Першае, што трэба зрабіць, гэта запампаваць з падзелу Download, апошні крыніца JigLibX'a. Пасля распакавання, мы ствараем новы праект (у маім выпадку XNA 3/1 Праект), націсніце на Аглядальнік рашэнняў галоўны корань нашага праекта (рашэнне NazwaNaszegoProjektu), пстрыкніце правай кнопкай мышы і выберыце Add> існуючага праекта

jiglibx-dodawanie-projektu1

Даданне існуючага праекта да існуючых

абярыце тэчку, куды вы распакавалі загружаныя раней фізічны рухавічок: JigLibX> JigLibX.csproj.

jiglibx-dodawanie-projektu

Даданне існуючага праекта да існуючых

Калі вы выбралі пры стварэнні праекта, праект 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. Для пачатку, у канструктару нашага класа, мы ствараем 2 аб'екта.

  грамадскіх 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> Клас ..

jiglibx-boxactor-class

Стварыце клас 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 прыватнага органа;
         Дзяржаўны орган, орган
         {
             атрымліваць
             {
                 _body вярнуцца;
             }
         }

         прыватныя CollisionSkin _skin;
         грамадскіх скуры CollisionSkin
         {
             атрымліваць
             {
                 _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; 

Першыя два радкі складаюць нашы акцёры. Параметры ў канструктару, выступаем за: 1. - Напрыклад, у якім акцёр стварыў, у дадзеным выпадку, наша дадатак асноўнага класа Game1, другі - пазіцыі, трэцім параметрам з'яўляецца памер элемента.

Трэцяя радок азначае, што другі аб'ект нерухомы, і як відаць з параметраў, што перадаюцца ў канструктар, то гэта будзе нашмат вышэй (5 разоў), чым першы аб'ект.

Чацвёртая і пятая лінія створаны намі будзе дадаць аб'екты ў набор кампанентаў, якія будуць намаляваныя аўтаматычна гульня клас, які ў спадчыну пасля вашага прыкладання.

Маляванне

Звернемся цяпер да апошняй стадыі, гэта значыць, адмовіўшыся ад выніку на экране на самай справе даволі словамі, вы малюеце сцэну. Але, па-першае, мы павінны дадаць мадэль вокны, якія мы выкарыстоўваем у нашым праекце. Прыклад мадэлі з інавацыйных гульняў , вы можаце спампаваць тут .

Пасля распакавання файла і скапіяваць 2 змяшчаюцца файлаў (з мадэлі і тэкстуры) павінен быць у Solution Explorer, пстрыкніце правай кнопкай мышы Змесціва папкі (у нашым праекце) і абярыце Add> Existing Item ... і абярыце файл мадэлі. FBX і Паўтарыце крок, выбраўшы файл з тэкстурай.

jiglibx-content

Пасля дадання папкі Змесціва мадэлі і тэкстуры

Клас BoxActor, стварыць новы метад, які будзе загружаць нашы мадэлі:

  абарона LoadContent карэкцыі несапраўднымі ()
 {
     Мадэль = Game.Content.Load ("boxModel");
 } 

і дадаць на ўсе метады гэтага класа, аб'ява зменнай мадэлі:

  прыватная мадэль мадэль; 

Затым дадайце таго ж класа, наступным спосабам:

 GetWorldMatrix прыватных Matrix () {. Вяртанне 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)


Змяненні, запісу

Катэгорыі: . чыстая / C # / XNA
Вы можаце сачыць за адказамі да гэтага запісу праз стужку RSS 2.0 . Вы таксама можаце напісаць свой ​​каментар , або спасылку на гэты пост на вашай старонцы.

3 каментар / с

12 верасня 2009 г
BartekB

Ну, я вам скажу, што тут не каментаваць, размяшчаць на высокім узроўні, як звычайна.


15 верасня 2009

вельмі цікавая запіс, не гуляйце з графікам, але я чытаў з задавальненнем. Дзякуй!


1 студзеня 2012 года

Пасля майго манітора, тысячы людзей у свеце атрымліваюць персанальныя крэдыты ад розных крэдытораў. Такім чынам, ёсць добрыя магчымасці, каб знайсці камерцыйнага крэдыту ў кожнай краіне.


  • Obraz CAPTCHY
    Абнавіць малюнак
    *

    Абарона ад спаму на WP-SpamFree