XNA: põhilised füüsika JigLibX
XNA ise ei paku klasside aidata meil arvutamisel füüsika. Kuigi on võimalik avastada sama kokkupõrge, vaid see, kuidas objekte käituma, kui see avastatakse, sõltub ainult koodi kirjutanud meile. Kui me ei kasuta valmis raamatukogud teenistujad. Võtsin kõige populaarsem tapeet XNA'ową opensource raamatukogu - JigLibX .
Mida saab saavutada?
Viidates filmi autorid, kaks näidet:
Ja näiteks ... loodud samade autorite JigLibX:
Veel videoid ehitusobjektile .
Projekti loomine
Esimene asi, mida peaks tegema, on alla laadida alates Download osa, viimane allikas JigLibX'a. Peale lahtipakkimist me luua uus projekt (minu puhul XNA 3,1 projekt), klõpsake Solution Exploreri peamine root meie projekti (Solution NazwaNaszegoProjektu), paremklõpsake ja valige Lisa> Olemasolevad Project

Lisades olemasoleva projekti olemasoleva
seejärel valige kaust, kuhu pakkimata varem allalaaditud füüsika mootor: JigLibX> JigLibX.csproj.

Lisades olemasoleva projekti olemasoleva
Kui valisid loomisel Projekti projekti XNA versioon 3,1, siis tuleb nüüd teha projekti JigLibX upgrade versiooni 3,1. Teeme seda paremklõpsates projekti root JigLibX> Upgrade Solution. Teeme seda, et hiljem oleks võimalik lisada projekti põhiprojekti viited JigLibX'a. Vastasel korral ei ole võimalik, kuna praegu see on mõeldud versiooni 3,0. Muutused versioon 3,1 ei ole piisavalt suur, kuid täielikult kõrvaldada raamatukogu töötab käesoleva versiooni XNA.
Siis, paremklõps just meie põhiprojekti (minu puhul seda nimetatakse FizykaZJigLibX)> Lisa viide> Projektid> JigLibX. Puus meie projekti kausta viited peaks ilmuma JigLibX. Nüüd on meil juurdepääs sellele namespace.
Lisaks füüsika süsteemi
Esiteks on vaja lisada vajalikud namespace oma Game1.cs.
kasutades JigLibX.Physics; kasutades JigLibX.Geometry; kasutades JigLibX.Collision;
Me ei saa seetõttu kasutada klasside kirjutatud loojad JigLibX'a. For starterid, et ehitaja on meie klassi, loome 2 objekti.
avaliku Game1 () { graafika = new GraphicsDeviceManager (this); Content.RootDirectory = "Sisu"; PhysicsSystem PhysicsSystem maailm = new (); CollisionSystemSAP world.CollisionSystem = new (); }
Objekt maailmas, mis PhysicSystem näiteks algatada kõik vajalikud muutujad ja kontroller tajuda, mis toimub sees meie taotlus. Üritused seotud füüsika. Järgmisel real, et atribuutide CollisionSystem, anname CollisionSystemSAP loodud objekt, mis on vajalik, et avastada mõni kokkupõrkeid. See klass kasutab algoritmi "pühkima ja ploomi" kokkupõrke avastamise, mis selles näites on piisav, kuid kui otsite kaustas projekti JigLibX Kokkupõrge näeme, et oleme võimelised ära teiste ready-klassi, kasutades erinevaid algoritme, näiteks põhinevad kohta (võre). Kui jätate selle sammu, et me ei suutnud reageerida kokkupõrkeid ja rajatised lihtsalt mööda neid ilma reaktsioon.
Sa peaksid tegema üks asi, nimelt korrapäraselt ajakohastada meie poole, mis talletab loogika füüsika. Selleks lihtsalt Update meetod lisatakse järgmine kood:
ajasammu = float (float) gameTime.ElapsedGameTime.Ticks / TimeSpan.TicksPerSecond; PhysicsSystem.CurrentPhysicsSystem.Integrate (ajasammu);
Kuna PhysicsSystem.CurrentPhysicsSystem on osa staatiline, see on kättesaadav kõikjal meie projekti, mis kahtlemata suurendab mugavust see lahendus.
Loomise näitleja klass
Näitleja klassi, siis tegelikult aitavad luua objekt, mis loob parameetrite objekt meie taotlus ja mis on vajalik mis tahes arvutused kokkupõrkeid keskkond.
Loome klassi BoxActor.cs nii klõpsates root meie projekti> Lisa> klassi ..

Loo klass BoxActor.cs
Pane järgmine kood sees fail BoxActor.cs:
kasutades System; kasutades Microsoft.Xna.Framework; kasutades Microsoft.Xna.Framework.Graphics; kasutades JigLibX.Math; kasutades JigLibX.Physics; kasutades JigLibX.Geometry; kasutades JigLibX.Collision; namespace FizykaZJigLibX { public class BoxActor: DrawableGameComponent { era Vector3 positsiooni; era Vector3 ulatuses; _body eraõiguslik isik; Avalik Kere { saama { _body tagasi; } } era CollisionSkin _skin; avaliku CollisionSkin Skin { saama { _skin tagasi; } } avaliku BoxActor (Mäng, Vector3 asendis Vector3 skaala): base (mäng) { this.position = positsioonile; this.scale = skaala; } } }
BoxActor klassi pärib alates klassi DrawableGameComponent sest näitleja peab välja ekraanil, et saaksime näha, mis juhtub. Pole positsiooni hoiab infot keskpunkti karbi sees, ja ulatuse - tema mõõtmed. Body tuleb mõista kui muutuja, mis talletab informatsiooni liikumist ja rotatsiooni meie objekt. Naha vastutab avastada kokkupõrkeid.
Loomine Kere ja CollisionSkin
Järgmise sammuna on plaanis lisada lõpus BoxActor klassi konstruktori, järgmine kood:
_body = new Body (); _skin = new CollisionSkin (_body); _body.CollisionSkin = _skin;
Sest _body muutuja, määrata näiteks keha, mis salvestab põhilist teavet riigis, kus objekt asub. _skin On informatsiooni "shell" meie poole, mis luuakse põhinema varem määratud _body. Lõpuks, see on veel CollisionSkin vara _body.
Nüüd, millised kuju, on meie näitleja. Sõltub sellest, kuidas ta käitub laval. Vaata primitiivid klassi leida JigLibX> primitiivid.
Meie puhul me tahame, et meie eesmärk käituda kasti, nii et me kasutame selle klassi Box, lisades järgmise koodi lõpus klassi konstruktori BoxActor.
Kast kast = new Box (Vector3.Zero, Matrix.Identity, ulatus); _skin.AddPrimitive (box, uus MaterialProperties (0.8f, 0.8f, 0.7f));
Eespool, oleme loonud uue objekti klassi Box, kelle parameetrid ehitaja seista: asukoht kesklinnas meie Box, Box sättumusest (ühikmaatriks tähendab, rotatsioon jne), ja sellises ulatuses, mis seatakse ehitamisel objekti BoxActor.
2. rida, kokkupõrkamise pind lisab meie poole, et oleks võimalik reageerida muid esemeid. Esimene parameeter on objekti tüüp, kellega me tegelema, teine parameeter määrab käitumise materjali (hõõrdumine ja elastsus).
Massi määramiseks objekti
Massi määramiseks objekt, mis lisaks raskuskese, sõltub suunas jõud, mis mõjutab selle objekti, autorit JigLibX loodud järgmist meetodit, mis lisati klassi BoxActor.
SetMass era Vector3 (float mass) { PrimitiveProperties primitiveProperties = new PrimitiveProperties ( PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass, mass); float junk; Vector3 com; Matrix IT; Matrix itCoM; Skin.GetMassProperties (primitiveProperties, välja rämps, välja com, välja see, out itCoM); Body.BodyInertia = itCoM; Body.Mass = junk; com tagasipöördumist; }
Lõpus ehitaja sama klassi, me kindlaks massi alljärgnevalt:
Com = SetMass Vector3 (1.0f); Ja see, kui tegemist on üle võtmas mass meie objekt
. Muidugi ei takista miski, et rakendamise ajal, on võimalik muuta mass objekti.
Milles õiges kohas Box'aw
Selles sammus, seadsime meie Box on objekt, mida saab esitada ehitaja ajal luua meie näitleja. See on vajalik, et see sobiks keha meie poole, samuti kokkupõrget pinnaga vastavalt sama objekt, mis mõju oli piisav ja realistlik.
Lõpus BoxActor ehitaja lisada järgmine kood:
_body.MoveTo (asukoht, Matrix.Identity); _skin.ApplyLocalTransform (uus Transform (-com, Matrix.Identity)); _body.EnableBody ();
1. rida liigub "body" meie näitleja konkreetse objekti. 2. parameeter MoveTo meetod näitab suunda objekt.
2. rida seab kokkupõrke piirkonnas vastavalt raskuskese vara.
Viimane rida, mis võimaldab simulatsiooni _body ja ka näitleja. See ei ole vajalik, sest simulatsioon on vaikimisi keelatud.
Creation of the World.
Kõik seadistused, mis on seotud raamistikke on seatud, nii et võid minna, et luua maailma. Lõpus ehitaja peamiste fail meie projekti game1.cs lisatakse järgmine kood:
fallingBox = new BoxActor (see uus Vector3 (5, 20, 5), uued Vector3 (2, 2, 2)); immovableBox = new BoxActor (see uus Vector3 (0, -5, 0), uus Vector3 (10, 10, 10)); immovableBox.Body.Immovable = true; Components.Add (fallingBox); Components.Add (immovableBox);
Osa on veel lisatud kõik meetodid klassis Game1:
BoxActor fallingBox; BoxActor immovableBox;
Kaks esimest rida moodustavad meie osalejad. Parameetrite ehitaja seista: 1. - näiteks kus näitleja loodud, antud juhul meie taotlus Põhiklass Game1, 2. - positsioon, 3. parameeter on suurus objekt.
3. rida tähendab, et teine objekt on liikumatu, ja nagu näha parameetrid edasi ehitaja, siis on see palju suurem (5x) kui esimene objekt.
4. ja 5. rida loodud meile lisab objektide kogum komponente, mis valitakse automaatselt mängu klassi, mis pärib pärast oma taotluse.
Joonistus
Nüüd pöörduvad viimases etapis, see tähendab, visates tulemuse ekraan on tegelikult päris sõnad, mida teha stseeni. Aga kõigepealt peame lisama mudel box, mida me kasutame meie projekti. Proovi mudel on varustatud uusi mänge , mida saab alla laadida siit .
Peale lahtipakkimist fail ja kopeeritakse 2 isoleeritud failid (näidise ja tekstuur) peaks olema Solution Explorer, paremklõpsake sisu kaust (meie projekti) ja valige Lisa> Olemasolevad punkti ... ja valige mudel faili. FBX ja Korrake sammu, valides fail tekstuur.
Klassi BoxActor, luua uus meetod, mis laeb meie mudel:

kaitstud override void LoadContent () { mudel = Game.Content.Load ("boxModel"); }
ja lisage üle kõik meetodid selle klassi deklaratsiooni muutuja mudel:
era mudel mudel; Seejärel lisage samasse klassi, järgmisel viisil:
GetWorldMatrix era Matrix () {return Matrix.CreateScale (skaala) * _skin.GetPrimitiveLocal (0). Transform.Orientation * _body.Orientation * Matrix.CreateTranslation (_body.Position);} See tagastab massiivi meie keerulises maailmas, kus saame korrutades maatriksi järjekorras: skaalal kokkupõrge pind, ja tõesti nurk, kus see asub, "body" objekti (nurk) ja positsioon "body" objekti.
Me vajame rohkem projektsioon ja et maatriksid, mis lisab peamise rakendusena klass (failis game1.cs):
era Matrix valmis, kuva; avaliku Matrix View { saama { valmis, kuva tagasi; } } era Matrix _projection; avaliku Matrix projekteerimine { saama { _projection tagasipöördumist; } }
Aastal Game1 klassi konstruktori, lähme seatud lõpus projektsioon maatriks lisatakse järgmine rida:
Matrix.CreatePerspectiveFieldOfView _projection = ( MathHelper.ToRadians (45.0f) (Float) graphics.PreferredBackBufferWidth / (float) graphics.PreferredBackBufferHeight, 0.1F, 1000.0f );
Ma ei kirjelda parameetrite maatriks projektsiooni, sest eeldas, et praegu nad on üsna selge, aga kui ei, siis ma kutsun teid selle artikli kohta msdn'ie .
Vasak oleme seadnud arvates maatriks, me teeme seda meetodit Update, Game1.cs fail lisatakse järgmine rida koodi:
Matrix.CreateLookAt valmis, kuva = ( uus Vector3 (0, 10, 20), fallingBox.Body.Position, Vector3.Up );
See rida paneb ekraani keskel, siis on meie kuuluv objekt. Sügisel, näeme, kuidas tulevad mingi objektiga kokkupõrke, mis on fikseeritud.
Lõpuks jääb meid lisada meetod BoxActor Draw, mis on automaatselt üleskutse Selle objekti juhtida.
avaliku override void Draw (GameTime GameTime) { BasicWorldGame mäng = (BasicWorldGame) Mäng; Matrix [] muundamisvõtteid = new Matrix [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo (muudab); WorldMatrix = GetWorldMatrix Matrix (); foreach (ModelMesh võrgusilma model.Meshes) { foreach (BasicEffect mõju mesh.Effects) { effect.EnableDefaultLighting (); effect.PreferPerPixelLighting = true; effect.World = muundamisvõtteid [mesh.ParentBone.Index] * worldMatrix; effect.View = game.View; effect.Projection = game.Projection; } mesh.Draw (); } }
Koos esimese rea, siis on teil õigus vaadata ja projektsioon maatriksid, luues viite peateema meie taotlus. Ülejäänud koodi, on tüüpiline muudab objektid BasicEffect klassis. Ainus oluline asi on kasutada maailma maatriks, matriitsi, mis on arvutatud reaalajas, ja tegelikult JigLibX arvutatud meile.
Artikkel põhineb dokumentatsiooni leida siin , kuid on märke, et tekst reprodutseerida siin on aegunud ja kirjutas mulle versioon peaks tegema paremini. Võib-olla on see tingitud puudulik kooskõla XNA 3,1, kuid mida ma vaatasin meetodeid, üks neist on vähenenud 3-2 parameetrid. JigLibX versioon 0.3.1 (nagu 11. septembri 2009).
Valmis projekti alla laadida (XNA 3.1) (2,1 MB)
Koostanud demo (XNA 3.1) (0,3 MB)
Seotud kanded
3 comment / s
väga huvitav kanne, ei mängi graafik, aga ma lugesin seda naudinguga. Aitäh!
Pärast minu monitor, tuhanded inimesed kogu maailmas saavad isiklikud laenud erinevatest võlausaldajatele. Seega, seal on head võimalused leida kommertslaen igas riigis.




















































Noh ma ütlen teile, et ei ole siin kommenteerida, postitada kõrge nagu tavaliselt.