XNA: Osnovni fizika JigLibX
XNA sama, ne nudi nastavu kako bi nam pomogli u izračun fizike. Iako je moguće otkriti isti sudar, ali to je kako objekti ponašaju kada je otkriven, ovisi samo o kodu pisanom od nas. Ako ne koristite gotove knjižnice za službenike i namještenike. Uzeo sam najpopularniji pozadinu XNA'ową OpenSource knjižnica - JigLibX .
Što možete postići?
Pozivajući se na filmove tvrdnjama autora, dva primjera:
Primjer ... I stvorio po istom autora JigLibX:
Više videa na projektnoj lokaciji .
Stvaranje projekta
Prva stvar koju trebate učiniti je preuzeti iz Download sekcije, zadnji izvor JigLibX'a. Nakon raspakiranja, mi stvaramo novi projekt (u mom slučaju XNA 3.1 projekta), kliknite na Solution Explorer na glavnom korijenu našeg projekta (Rješenje NazwaNaszegoProjektu), desnom tipkom miša i odaberite Dodati> postojeći projekt

Dodavanje postojeći projekt na postojeće
zatim odaberite mapu u kojoj ste prethodno raspakirali preuzeli fizike stroja: JigLibX> JigLibX.csproj.

Dodavanje postojeći projekt na postojeće
Ako ste izabrali prilikom kreiranja projekta, projekta za XNA verziji 3.1, sada mora napraviti nadogradnju na verziju 3.1 projekta JigLibX. Mi to učiniti desnim klikom na projektu korijena JigLibX> Upgrade Solution. Mi to kasnije biti u mogućnosti dodati projekta glavnog projekta reference JigLibX'a. Inače, to nije moguće, jer u ovom trenutku je namijenjen za verzije 3.0. Promjene u verziji 3.1 nisu dovoljno velika, međutim, u potpunosti ispraviti knjižnica je djelovala pod ovom verzijom XNA.
Zatim desni klik na korijen našeg glavnog projekta (u mom slučaju to se zove FizykaZJigLibX)> Dodaj referenca> Projekti> JigLibX. U stablu našeg projekta, reference mapa trebala bi se pojaviti JigLibX. Sada imamo pristup tom imenski prostor.
Osim fizike sustava
Prvo, to će biti potrebno dodati odgovarajući prostor imena u vašim Game1.cs.
pomoću JigLibX.Physics; pomoću JigLibX.Geometry; pomoću JigLibX.Collision;
Stoga mogu koristiti klase pisane od strane kreatora JigLibX'a. Za početak, u konstruktoru naše klase, možemo stvoriti dva predmeta.
javni Game1 () { Grafika = new GraphicsDeviceManager (to); Content.RootDirectory = "Sadržaj"; PhysicsSystem PhysicsSystem svijet = new (); CollisionSystemSAP world.CollisionSystem = new (); }
Predmetni svijet, koji PhysicSystem primjer, pokrene sve potrebne varijable i kontroler će osjetiti događaje koji se odvijaju unutar našeg programa. Događaji u vezi s fizike. U sljedećem retku, na svojstva CollisionSystem, mi dodijeliti CollisionSystemSAP stvoren objekt, što je potrebno da otkrije bilo sudara. Ovaj razred koristi algoritam "pomesti i smanjilo" za sudara otkrivanje, koji je u ovom primjeru će biti dovoljna, ali ako žele mape u sudaru projekta JigLibX, vidimo da smo u mogućnosti iskoristiti druge gotove klase, koristeći različite algoritme, npr. na temelju na rešetki (grid). Ako izostavite ovaj korak da mi nije mogao reagirati na sudari, a objekti bi jednostavno proći po njima, bez ikakve reakcije.
Trebali bi napraviti jednu stvar, naime, redovito ažurirati naš objekt koji pohranjuje logiku fizike. Da biste to učinili, samo metoda Update, dodajte sljedeći kod:
timeStep float = (float) gameTime.ElapsedGameTime.Ticks / TimeSpan.TicksPerSecond; PhysicsSystem.CurrentPhysicsSystem.Integrate (timeStep);
Zbog PhysicsSystem.CurrentPhysicsSystem je sastavni dio statična, ona je dostupna s bilo kojeg mjesta u našem projektu, što nedvojbeno povećava praktičnost ovog rješenja.
Stvaranje glumac klase
Glumac klasa, to će zapravo služiti za stvaranje objekta, koji će postaviti parametre definira objekt u našem zahtjevu, a koji su nužni za bilo kakve kalkulacije o sudara s okolinom.
Stvorimo klase BoxActor.cs to klikom na korijen našeg projekta> Dodati> klase ..

Stvaranje BoxActor.cs klase
Stavite sljedeći kod unutar datoteke BoxActor.cs:
pomoću sustava; pomoću Microsoft.Xna.Framework; pomoću Microsoft.Xna.Framework.Graphics; pomoću JigLibX.Math; pomoću JigLibX.Physics; pomoću JigLibX.Geometry; pomoću JigLibX.Collision; namespace FizykaZJigLibX { public class BoxActor: DrawableGameComponent { privatni Vector3 položaj; privatni Vector3 razmjera; _body privatno tijelo; Javni organ tijela { dobiti { _body vratiti; } } privatni CollisionSkin _skin; javni CollisionSkin kože { dobiti { _skin vratiti; } } javni BoxActor (Divljač, Vector3 položaj, Vector3 skala): baza (igra) { this.position = položaj; this.scale = razmjera; } } }
BoxActor klasa nasljeđuje od klase DrawableGameComponent jer je glumac mora biti nacrtana na ekranu, tako da možemo vidjeti što se događa. Startnu poziciju drži podatke o središnjoj točki unutar okvira, i skala -. Njegove dimenzije Tijelo je treba shvatiti kao varijabla koja pohranjuje informacije o kretanju i rotacije naše kože objekta je odgovoran za otkrivanje sudara..
Izrada Tijelo i CollisionSkin
Sljedeći korak će biti dodajući na kraju BoxActor klasi konstruktora, sljedeći kod:
_body = new tijelo (); _skin = new CollisionSkin (_body); _body.CollisionSkin = _skin;
Za _body varijabla, dodijeliti instancu tijela, koji će pohraniti osnovne informacije o stanju u kojem se objekt nalazi. _skin Će imati informacije o "Shell" našeg objekta, koji će se izraditi na temelju prethodno postavljene _body. Na kraju, još uvijek je postavljen CollisionSkin nekretnina za _body.
Sada, odlučiti što oblik, imat će naš glumac. Ovisi o tome kako će se ponašati na pozornici. Potražite primitivi klasi naći u JigLibX> primitiva.
U našem slučaju, želimo naš objekt ponašati kao okvir, tako da mi koristimo ovu klasu okvir, tako da dodate sljedeći kod na kraju BoxActor klasi konstruktora.
Box kutija = new Box (Vector3.Zero, Matrix.Identity, skala); _skin.AddPrimitive (kutija, nova MaterialProperties (0.8f, 0.8f, 0.7f));
U gore, napravili smo novi objekt klase Box, čije parametre u konstruktoru stajati: položaj u središtu naše Boxu, okvir orijentacije (identitet matrica znači da nema rotacije, itd.), te mjerila koja će biti postavljen prilikom izgradnje objekta BoxActor.
U drugom redu, sudara s površine dodaje našeg objekta, tako da može reagirati s drugim predmetima. Prvi parametar je objekt tipa s kojim se bavimo, drugi parametar određuje ponašanje materijala (trenje i elastičnost).
Određivanje mase objekta
Da biste odredili masu objekta, koji pored toga težište će varirati ovisno o smjeru djelovanja sila koje će utjecati na ovaj objekt, autori JigLibX, stvorili sljedeću metodu koja je upisan u klasi BoxActor.
SetMass privatni Vector3 (float masa) { PrimitiveProperties primitiveProperties = Novi PrimitiveProperties ( PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass, misa); plutaju smeće; Vector3 com; Matrix IT; Matrix itCoM; Skin.GetMassProperties (primitiveProperties, od smeća, od ministara, iz njega, iz itCoM); Body.BodyInertia = itCoM; Body.Mass = smeće; com povratak; }
Na kraju konstruktora u istoj klasi, možemo odrediti masu kako slijedi:
Com = SetMass Vector3 (1.0f); I to kada je riječ o preuzimanju mase našeg objekta
. Naravno, ništa ne sprečava da, tijekom primjene, može promijeniti masu objekta.
Postavljanje je pravo mjesto Box'aw
U ovom koraku, postavili smo naše okvir na stavke koje će se u konstruktoru tijekom stvaranja našeg glumca. To je potrebno da stane tijelo našeg objekta, kao i sudara površine po istom predmetu da je učinak bio primjeren i realan.
Na kraju BoxActor constructor, dodajte sljedeći kod:
_body.MoveTo (položaj, Matrix.Identity); _skin.ApplyLocalTransform (novi Transform (-com, Matrix.Identity)); _body.EnableBody ();
Prva linija pomiče "tijelo" našeg glumca na određenu stavku. Drugi parametar MoveTo metode, pokazuje orijentaciju objekta.
Druga linija određuje područje sudara, odnosno težište imovine.
Zadnja linija, omogućuje simulaciju na _body i glumac. Ova linija je potrebno jer je simulacija je onemogućen.
Stvaranje svijeta.
Sve postavke se odnose na okvirima su postavljeni, tako da možete ići na stvaranje svijeta. Na kraju konstruktora u glavnoj datoteci našeg projekta game1.cs, dodajte sljedeći kod:
fallingBox = new BoxActor (to, novi Vector3 (5, 20, 5), Novi Vector3 (2, 2, 2)); immovableBox = new BoxActor (to, novi Vector3 (0, -5, 0), Nova Vector3 (10, 10, 10)); immovableBox.Body.Immovable = true; Components.Add (fallingBox); Components.Add (immovableBox);
Komponenta je uvijek biti dodan na sve metode u razredu Game1:
BoxActor fallingBox; BoxActor immovableBox;
Prve dvije linije čine naše glumce. Parametri u graditelj, stoji za: prvi - primjer u kojem je glumac stvorio, u ovom slučaju, naš glavni zahtjev Game1 klase, drugi - stav, treći parametar je veličina točke.
Treća linija označava da je drugi objekt nepomično, a kao što se vidi u parametrima prošao konstruktora, to će biti puno veća (5x) od prvog objekta.
Četvrti i peti red stvorio od nas će se dodati objekte zbirci komponenti koje će biti izvučeni automatski Game klase, koji nasljeđuje nakon primjene.
Crtanje
Sada se okrećemo u posljednju fazu, to jest odbacivanje rezultat na zaslonu je zapravo prilično riječi, crtate scenu. Ali prvo, moramo dodati modela okvir, koji ćemo koristiti u našem projektu. Uzorak model iz inovativnih igara , možete preuzeti ovdje .
Nakon što raspakirate datoteke i kopirati dva od sadržanih datoteka (s modelom i tekstura) treba biti u Solution Exploreru desnom tipkom miša kliknite Content folder (u našem projektu) i odaberite Dodati> postojeće stavke ... i odabir modela datoteku. Fbx i Ponovite korak, odabir datoteke s teksturom.
BoxActor klase, stvorite novu metodu koja će se učitati naš model:

zaštićene izborom LoadContent void () { Model = Game.Content.Load ("boxModel"); }
i dodati preko svih metoda u ovoj klasi, deklaracije varijable modela:
privatni model model; Zatim dodajte istu klasu, sljedeći način:
privatni Matrix GetWorldMatrix () { povratak Matrix.CreateScale (skala) * _skin.GetPrimitiveLocal (0). Transform.Orientation * _body.Orientation * Matrix.CreateTranslation (_body.Position); }
Vraća niz naše složenom svijetu, što smo dobiti množenjem matrica slijedeće: opseg sudara površine, a realno za kut u kojem se nalazi, u "tijelo" objekta (kut), a položaj "tijelo" objekta.
Mi ćemo morati više projekciju i prikaz matrice, koji će dodati na glavni aplikacija klase (u datoteci game1.cs):
privatni Matrix _view; javni Matrix View { dobiti { _view vratiti; } } privatni Matrix _projection; Projekcija javne Matrix { dobiti { _projection povratak; } }
U Game1 klasi konstruktora, neka je postavljen na kraju projekcijskog matrice dodavanjem sljedeće linije:
Matrix.CreatePerspectiveFieldOfView _projection = ( MathHelper.ToRadians (45.0f), (Float) graphics.PreferredBackBufferWidth / (float) graphics.PreferredBackBufferHeight, 0.1F, 1000.0f );
Neću opisati parametre matrice projekcije, jer pretpostavljam da u ovoj fazi su sasvim jasno, ali ako ne, ja vas pozivam da ovaj članak na msdn'ie .
Lijevo smo postaviti prikaz matrice, mi ćemo to učiniti u metode Update, Game1.cs datoteku dodavanjem sljedeće linije koda:
Matrix.CreateLookAt _view = ( Novi Vector3 (0, 10, 20), fallingBox.Body.Position, Vector3.Up );
Ova linija će uzrokovati centar ekrana, tu će biti naša pada objekt. Tijekom jeseni, vidjet ćemo kako će, dođu u sudaru s objektom koji je imobilizirane.
Na kraju, ostaje nam za dodavanje metodu za BoxActor turnir, koji se automatski naziva za ovaj objekt za crtanje.
javni nadjačavanje void Draw (GameTime gameTime) { BasicWorldGame igra = (BasicWorldGame) Game; Matrix [] = new pretvara Matrix [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo (pretvara); WorldMatrix = GetWorldMatrix Matrix (); foreach (ModelMesh mreže u model.Meshes) { foreach (BasicEffect učinak u mesh.Effects) { effect.EnableDefaultLighting (); effect.PreferPerPixelLighting = true; effect.World = preobražava [mesh.ParentBone.Index] * worldMatrix; effect.View = game.View; effect.Projection = game.Projection; } mesh.Draw (); } }
U prvom redu, da ćete imati pristup na more i matrica projekcije, stvarajući referencu na glavnu temu našeg zahtjeva. Ostatak koda, je tipično za pružanje objekte BasicEffect klase. Jedino važno je da koristite svijet matrica, matrica koji se izračunava u realnom vremenu, a zapravo JigLibX izračunate za nas.
U članku se na temelju dokumentacije nalazi ovdje , ali postoje indicije da tekst reproducira ovdje je zastario, a napisao je meni verziji trebao raditi bolje. Možda je to zbog nepotpunog kompatibilnost sa XNA 3.1, ali iz onoga što sam gledao na metode, jedan od njih je smanjen s tri na dva parametra. JigLibX verzija 0.3.1 (od 11. rujna 2009.)
Završio projekt za download (XNA 3.1) (2.1 MB)
Obrada demo (XNA 3.1) (0.3 MB)
Povezani zapisi
3 komentar / a
vrlo zanimljiv ulaz, ne igraju s graf, ali sam ga čitati s užitkom. Hvala!
Nakon mog monitora, tisuće ljudi u svijetu dobiti osobni zajmovi iz različitih povjerilaca. Dakle, postoji dobra mogućnost da se pronađe komercijalni kredit u svakoj zemlji.




















































Pa ja ću ti reći da nije ovdje komentirati, postavljati na visokoj razini, kao i obično.