XNA: la física bàsica de JigLibX
XNA si mateixa, no ofereix classes perquè ens ajudi en el càlcul de la física. Tot i que és possible detectar la mateixa col · lisió, però així és com es comporten els objectes quan es detecta, només depèn de codi escrit per nosaltres. Si no utilitzem les biblioteques preparades per als servents. Vaig prendre el fons de pantalla més popular de la biblioteca XNA'ową OpenSource - JigLibX .
Què pot aconseguir?
Referint-se a les pel · lícules als autors, dos exemples:
... I un exemple creat pel JigLibX mateixos autors:
Més vídeos al lloc del projecte .
Creació d'un projecte
El primer que has de fer és descarregar des de la secció de descàrregues, el JigLibX'a última font. Després de desembalar, vam crear un nou projecte (en el meu cas XNA 3.1 del projecte), feu clic a l'Explorador de solucions en l'arrel principal del nostre projecte (Solució NazwaNaszegoProjektu), feu clic dret i seleccioneu Afegeix> projecte existent

Afegeix projecte existent per l'actual
a continuació, seleccioneu la carpeta on ha desempaquetat prèviament descarregat un motor de física: JigLibX JigLibX.csproj>.

Afegeix projecte existent per l'actual
Si escolliu l'hora de crear el projecte, el projecte de la versió 3.1 de XNA, ara ha de fer l'actualització JigLibX projecte a la versió 3.1. Fem això fent clic dret en l'arrel de la solució del projecte JigLibX> Actualitzar. Fem això per després poder afegir el projecte principal del projecte JigLibX'a referències. En cas contrari, això no és possible, ja que en l'actualitat es pretén per a la versió 3.0. Canvis en la versió 3,1 no són prou grans, però, per corregir completament la biblioteca és operat sota aquesta versió de XNA.
A continuació, feu clic dret a l'arrel del nostre projecte principal (en el meu cas es diu FizykaZJigLibX)> Afegeix referència> Projectes> JigLibX. En l'arbre del nostre projecte, les referències de carpetes ha d'aparèixer JigLibX. Ara tenim accés a aquest espai de noms.
L'addició de la física del sistema
En primer lloc, caldrà afegir l'espai de noms adequat a les seves Game1.cs.
utilitzant JigLibX.Physics; utilitzant JigLibX.Geometry; utilitzant JigLibX.Collision;
Per tant, pot utilitzar les classes escrites pels creadors de JigLibX'a. Per començar, en el constructor de la nostra classe, creem dos objectes.
pública Game1 () { Gràfics = new GraphicsDeviceManager (est); Content.RootDirectory = "contingut"; PhysicsSystem PhysicsSystem = món nou (); CollisionSystemSAP world.CollisionSystem = new (); }
El món dels objectes, la instància PhysicSystem, iniciar totes les variables necessàries i el controlador detectarà els esdeveniments que tenen lloc dins de la nostra aplicació. Esdeveniments relacionats amb la física. En la següent línia, a la CollisionSystem propietats, se li assigna un objecte CollisionSystemSAP creat, la qual cosa és necessari per detectar les col · lisions. Aquesta classe utilitza un algorisme de "escombrat i poda" per a la detecció de col · lisions, que en aquest exemple, serà suficient, però si busca a la carpeta en la col · lisió del projecte JigLibX, veiem que som capaços de prendre avantatge d'altres llistes de classes, l'ús d'algoritmes diferents, per exemple, segons en la quadrícula (grid). Si s'omet aquest pas que no va poder reaccionar a les col · lisions, i les instal · lacions simplement passar per ells sense cap tipus de reacció.
Heu de fer una cosa, és a dir, per actualitzar periòdicament la nostra instal · lació que emmagatzema la lògica de la física. Per a això, només el mètode d'actualització, afegir el següent codi:
pas de temps = float (float) gameTime.ElapsedGameTime.Ticks o TimeSpan.TicksPerSecond; PhysicsSystem.CurrentPhysicsSystem.Integrate (pas de temps);
Com que PhysicsSystem.CurrentPhysicsSystem és un component de l'estàtica, està disponible des de qualsevol lloc del nostre projecte, el que sens dubte augmenta la conveniència d'aquesta solució.
La creació d'una classe d'agent
Classe Actor, que en realitat servirà per crear l'objecte, que establirà els paràmetres que defineixen l'objecte de la nostra sol · licitud, i que són necessaris per als càlculs sobre les col · lisions amb el medi ambient.
Anem a crear una classe per BoxActor.cs fent clic a l'arrel del nostre projecte> Afegeix classe> ..

Crear una classe BoxActor.cs
Col · loqui el següent codi dins de les BoxActor.cs d'arxius:
using System; utilitzant Microsoft.Xna.Framework; utilitzant Microsoft.Xna.Framework.Graphics; utilitzant JigLibX.Math; utilitzant JigLibX.Physics; utilitzant JigLibX.Geometry; utilitzant JigLibX.Collision; espai de noms FizykaZJigLibX { pública BoxActor classe: DrawableGameComponent { posició Vector3 privat; escala Vector3 privat; _body entitat privada; Consell d'organisme públic { obtenir { _body tornar; } } privada _skin CollisionSkin; Pell CollisionSkin pública { obtenir { _skin tornar; } } BoxActor públic (joc de joc, Vector3 posició, Vector3 escala): base (joc) { this.position = posició; this.scale = escala; } } }
Classe BoxActor hereta de la classe DrawableGameComponent perquè l'actor ha de ser dibuixat a la pantalla, perquè puguem veure què passa. Pole position conté informació sobre un punt central dins de la caixa, i l'escala -. Les seves dimensions corporal s'ha d'entendre com una variable que emmagatzema informació sobre el moviment i la rotació del nostre objecte de la pell és responsable de la detecció de col · lisions ..
Creació de cos i CollisionSkin
El següent pas serà afegir al final del constructor de la classe BoxActor, el codi:
_body = new Cos (); _skin = new CollisionSkin (_body); _body.CollisionSkin = _skin;
Per _body variable, assignar una instància de cos, que emmagatzemarà la informació bàsica sobre l'estat en què es troba l'objecte. _skin Tindrà informació sobre la "closca" de la nostra instal · lació, que es crearà en base a _body establert prèviament. Finalment, encara està configurat CollisionSkin propietat per _body.
Ara bé, decidir quina forma, comptarà amb el nostre actor. Depèn de com es comportarà en l'escenari. Busqueu la classe primitives trobades a primitius> JigLibX.
En el nostre cas, volem que el nostre objecte es comporti com una caixa, de manera que utilitzar aquest quadre de classes, afegint el següent codi al final de la BoxActor constructor de la classe.
Caixa caixa = new Box (Vector3.Zero, Matrix.Identity, escala); _skin.AddPrimitive (caixa, MaterialProperties noves (0.8f, 0.8f, 0.7f));
En això, hem creat un nou objecte de classe Box, els paràmetres en el constructor d'estar aturat per: La posició del centre de la nostra Caixa, orientació Caixa (matriu d'identitat significa que no hi rotació, etc), i una escala que s'estableix quan la construcció de la BoxActor objecte.
La segona línia, xocant amb la superfície afegeix a la nostra instal · lació perquè pugui reaccionar amb altres objectes. El primer paràmetre és un tipus d'objecte amb el qual ens ocupem, el segon paràmetre especifica el comportament del material (la fricció i l'elasticitat).
La determinació de la massa de l'objecte
Per determinar la massa de l'objecte, que a més del centre de gravetat, variarà depenent de la direcció de les forces que afecten a aquest objecte, els autors JigLibX, van crear el següent mètode que s'ha afegit a la BoxActor classe.
SetMass privada Vector3 (massa flotant) { PrimitiveProperties PrimitiveProperties = PrimitiveProperties nous ( PrimitiveProperties.MassDistributionEnum.Solid, PrimitiveProperties.MassTypeEnum.Mass, la Missa); suren escombraries; Vector3 com; Matriu de TI; Matriu de ITCOM; Skin.GetMassProperties (primitiveProperties, a escombraries, a compartir, fora, fora ITCOM); Body.BodyInertia = ITCOM; Body.Mass escombraries =; com retorn; }
Al final del constructor de la mateixa classe, es determina la massa de la següent manera:
Com = SetMass Vector3 (1.0f); I això és quan es tracta de fer-se càrrec de la massa del nostre objecte
. Per suposat, res impedeix que, durant l'aplicació, pot canviar la massa de l'objecte.
Ajust de la Box'aw lloc correcte
En aquesta etapa, hem creat la nostra Caixa en l'element que es donarà en el constructor durant la creació del nostre actor. Això és necessari per adaptar-se al cos de la nostra instal · lació, així com la superfície de xoc d'acord amb el mateix objecte que l'efecte era adequat i realista.
Al final del constructor de BoxActor, afegiu el següent codi:
_body.MoveTo (posició, Matrix.Identity); _skin.ApplyLocalTransform (nova transformació (-com, Matrix.Identity)); _body.EnableBody ();
La primera línia es mou el "cos" del nostre actor en un article específic. El segon paràmetre de mètode MoveTo, indica l'orientació de l'objecte.
La segona línia s'estableix l'àrea de col · lisió respectivament del centre de gravetat de la propietat.
L'última línia, permet la simulació de _body i també un actor. Aquesta línia és necessària perquè la simulació està desactivat per defecte.
Creació del Món.
Tots la configuració relacionada amb els marcs s'han establert, perquè pugui anar a crear el món. Al final del constructor a l'arxiu principal de game1.cs nostre projecte, afegiu el següent codi:
fallingBox = nou BoxActor (això, nou Vector3 (5, 20, 5), nou Vector3 (2, 2, 2)); immovableBox = nou BoxActor (això, nou Vector3 (0, -5, 0), nou Vector3 (10, 10, 10)); immovableBox.Body.Immovable = true; Components.Add (fallingBox); Components.Add (immovableBox);
Component encara no s'ha afegit en tots els mètodes de la classe Game1:
BoxActor fallingBox; BoxActor immovableBox;
Les dues primeres línies formen als nostres actors. Els paràmetres en el constructor, signifiquen: el primer - instància en la qual l'actor va crear, en aquest cas, la nostra principal aplicació Game1 classe, el segon - la posició, el tercer paràmetre és la mida de l'element.
La tercera línia vol dir que el segon objecte és immòbil, i com es veu en els paràmetres passats al constructor, serà molt més gran (5x) que el primer objecte.
La línia de quart i cinquè creat per nosaltres afegir objectes a una col · lecció de components que s'elaborarà de forma automàtica per la classe de joc, que hereta després de la seva aplicació.
Dibuix
Passem ara a l'última etapa, és a dir, descartar el resultat a la pantalla és en realitat les paraules boniques, es dibuixa l'escena. Però primer, cal afegir el model de caixa, que utilitzem en el nostre projecte. Exemple de model dels Jocs innovadors , es pot descarregar aquí .
Després de descomprimir l'arxiu i la còpia de dos dels arxius continguts (amb el model i la textura) ha d'estar en l'Explorador de solucions, feu clic a la carpeta de contingut (en el nostre projecte) i seleccioneu Afegeix> element existent ... i seleccioneu el fitxer del model. FBX i Repetiu el pas, la selecció d'un arxiu de la textura.
El BoxActor classe, creeu un nou mètode que es carrega el model:

anul · lació protegida LoadContent buit () { model = Game.Content.Load ("boxModel"); }
i afegir a tots els mètodes d'aquesta classe, la declaració d'una variable del model:
model de model privat; A continuació, afegiu la mateixa classe, el següent mètode:
GetWorldMatrix privada Matrix () {. Matrix.CreateScale retorn (escala) * _skin.GetPrimitiveLocal (0) * Transform.Orientation _body.Orientation * Matrix.CreateTranslation (_body.Position);} Es retorna una matriu del nostre món complex, que s'obté en multiplicar les matrius en la seqüència: l'escala de la superfície de la col · lisió, i realment l'angle en què es troba, el "cos" de l'objecte (l'angle), i la posició del "cos" de l'objecte.
Anem a necessitar més projecció i les matrius d'opinió, que se sumarà a la classe principal d'aplicació (en els game1.cs d'arxiu):
privada _view Matrix; Vista pública Matrix { obtenir { _view tornar; } } _projection Matrix privat; matriu de projecció pública { obtenir { _projection retorn; } }
En el constructor de la classe Game1, posarem al final de la matriu de projecció mitjançant l'addició de la següent línia:
Matrix.CreatePerspectiveFieldOfView _projection = ( MathHelper.ToRadians (45.0f), (Float) graphics.PreferredBackBufferWidth / (float) graphics.PreferredBackBufferHeight, 0.1F, 1000.0f );
No vaig a descriure els paràmetres de la matriu de la projecció, perquè suposo que en aquesta etapa són bastant clares, però si no, els convido a aquest article en msdn'ie .
Esquerra hem establert la matriu d'opinió, ho farem en l'actualització del mètode, arxiu Game1.cs afegint la següent línia de codi:
Matrix.CreateLookAt _view = ( nou Vector3 (0, 10, 20), fallingBox.Body.Position, Vector3.Up );
Aquesta línia farà que el centre de la pantalla, no serà el nostre objecte que cau. Durant la tardor, veurem com, entren en col · lisió amb un objecte que hagi estat immobilitzada.
Finalment, ens queda per afegir un mètode per BoxActor Draw, que es diu automàticament a aquest objecte a dibuixar.
public override void Draw (temps de joc GameTime) { BasicWorldGame joc = (BasicWorldGame) Joc; La matriu [] = new Matrix es transforma [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo (transforma); WorldMatrix = GetWorldMatrix Matrix (); foreach (malla ModelMesh en model.Meshes) { foreach (efecte BasicEffect en mesh.Effects) { effect.EnableDefaultLighting (); effect.PreferPerPixelLighting = true; effect.World = transformacions [mesh.ParentBone.Index] * worldMatrix; effect.View = game.View; effect.Projection = game.Projection; } mesh.Draw (); } }
Amb la primera línia, vostè tindrà accés a la vista i les matrius de projecció, la creació d'una referència al tema principal de la nostra aplicació. La resta del codi, és típic per a la prestació dels objectes amb la classe BasicEffect. L'única cosa important és utilitzar la matriu món, la matriu que es calcula en temps real, i en realitat JigLibX calculat per nosaltres.
L'article es basa en la documentació que es troba aquí , però hi ha indicis que el text que es reprodueix aquí és obsolet, i escrit per la meva versió hauria de funcionar millor. Potser això sigui degut a la compatibilitat incompleta amb XNA 3.1, però pel que va mirar als mètodes, un d'ells s'ha reduït de tres a dos paràmetres. JigLibX versió 0.3.1 (l'11 de setembre de 2009).
El projecte acabat per descarregar (XNA 3.1) (2.1 MB)
Demo compilat (XNA 3.1) (0.3 MB)
Articles relacionats
3 comentari / s
una entrada molt interessant, no juguin amb la gràfica, però el vaig llegir amb plaer. Gràcies!
Arran de la meva monitor, milers de persones al món obtenir els préstecs personals de diversos creditors. Per tant, hi ha bones possibilitats de trobar un préstec comercial a cada país.




















































Bé, jo vaig a dir que no és aquí per fer comentaris, publicar en un alt nivell, com de costum.