Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Farseer Physics Engine: un motore fisico per Silverlight

Una libreria per creare giochi o animazioni con oggetti vettoriali e proprietà cinematiche
Una libreria per creare giochi o animazioni con oggetti vettoriali e proprietà cinematiche
Link copiato negli appunti

Farseer Physics è un engine fisico (cinematico) open source, sviluppato interamente in C# che permette di creare grafica in 2D per le piattaforme Microsoft XNA e Silverlight.

I punti di forza di questo engine secondo il suo creatore Jeff Weber sono tutti focalizzati sulla semplicità con cui è possibile creare applicazioni divertenti quali ad esempio giochi altamente dinamici e allo stesso tempo molto curati dal punto di vista fisico. Grazie anche alla documentazione presente su CodePlex dove è ospitato il progetto, è possibile iniziare sin da subito e con poco sforzo a creare qualcosa di funzionale.

In questo articolo vedremo i passi necessari per utilizzare questo strumento e analizzeremo uno degli esempi rilasciati dallo stesso autore per mostrare le capacità del suo prodotto.

La Terminologia

Cominciamo prendendo confidenza con i termini utilizzati in Farseer Physics Engine, per comprendere meglio quello di cui stiamo parlando. Sostanzialmente questo engine fisico permette di applicare agli oggetti:

  • forze lineari che li fanno spostare nello spazio
  • forze di torsione che imprimono rotazioni

Il tutto avviene su un piano fisico virtuale in due dimensioni. Gli oggetti che è possibile muovere sul piano sono chiamati Bodies (corpi). Quindi sostanzialmente il processo di creazione di un ambiente virtuale con Farseer Physics Engine può essere schematizzato nei seguenti passi:

  • Creazione di bodies (oggetti)
  • Aggiunta di bodies al piano di simulazione
  • Inizio del ciclo di simulazione, che comprende:
    • Applicazione delle forze lineari e di torsione ai corpi
    • Aggiornamento dei corpi nel piano di simulazione
    • Posizionamento degli sprite dei corpi congiuntamente ad essi
    • Tracciamento degli sprite di simulazione
  • Termine del ciclo di simulazione

I corpi sono le entità più semplici in quanto essi non avendo "consistenza" nel mondo 2D non conoscono il concetto di "collisione" e pertanto possono trapassarsi vicendevolmente.

Le collisioni vengono invece introdotte tramite l'utilizzo di una seconda tipologia di oggetto, denominata Geometria. Gli oggetti geometrici sono rappresentati come poligoni 2D che possono essere concavi o convessi e sono composti da un insieme di vertici.

L'unione di una geometria con un body (corpo) permette di attribuire a quest'ultimo una "consistenza" grazie alla quale il corpo può subire delle collisioni con altri corpi dotati anch'essi di geometrie.

Ogni corpo possiede inoltre uno o più Sprite, ovvero dei riempimenti che permettono di dare "fisicità" ai corpi attraverso la colorazione dell'interno di essi.

Altri elementi importanti con cui si ha a che fare in Farseer Physics sono i vettori (Vector) ovvero elementi che permettono di applicare una forza gravitazionale ad un corpo. Ogni vettore ha una direzione ed una forza con la quale agisce sul corpo e grazie ad essi è possibile dare realismo agli oggetti facendo in modo che essi si comportino nei confronti della gravità esattamente come si comporterebbero i loro omologhi nel mondo reale.

L'installazione

Possiamo scaricare Farseer Physics, scegliendo tra la versione per XNA o quella per Silverlight rispettivamente con o senza esempi di codice. In questo articolo esamineremo in particolare la versione per Silverlight che richiede quindi per la sua corretta esecuzione la presenza sulla macchina dei Silverlight Tools Beta 2 per Visual Studio 2008.

Farseer Physics si presenta come una solution di Visual Studio contenente l'intero codice sorgente dell'engine ed eventualmente diversi progetti demo se si è scelto il pacchetto con gli esempi di codice. Aprendo in Visual Studio la solution FarseerPhysics.sln ci troveremo davanti a due progetti, il progetto GettingStartedSilverlight contenente diverse demo dell'engine ed il progetto FarseerPhysics che contiene il codice sorgente dell'engine (che i più curiosi potranno sbirciare per vedere il dietro le quinte di questo tool).

Per utilizzare l'engine in un nostro progetto possiamo quindi semplicemente referenziare il progetto FarseerPhysics ed utilizzarne immediatamente le classi. Prima ancora di mettere mani al codice per avere un'idea di cosa è capace il motore fisico, possiamo molto semplicemente premere F5 in Visual Studio ed avviare l'interfaccia iniziale dalla quale è possibile far partire una delle otto demo messe a disposizione.

Figura 1. Indice delle demo
Indice delle demo

Facendo partire ad esempio la demo "Static Bodies And Offset Geometries" potremo sperimentare il movimento di un oggetto a forma di stella che cade sotto il peso della gravità urtando degli scalini che ne rallentano la discesa.

Figura 2. Demo numero 3
Demo numero 3

Il codice

Diamo ora uno sguardo al codice che è dietro una di queste demo ed in particolare esaminiamo il file Demo2.cs del progetto GettingStartedSilverlight. Questa demo nella sua semplicità ci mostra i fondamentali di Farseer Physics e ci può permettere di prendere confidenza con le proprietà ed i metodi del motore.

Il gestore di evento Initialize contiene tutto il codice che crea i due corpi sul piano di simulazione. Questa demo infatti mostra semplicemente due oggetti, l'uno di forma quadrata, l'altro di forma tondeggiante, aventi diverso colore. Inoltre i due corpi hanno ciascuno una propria geometria per fare in modo che possano scontrarsi tra loro e reagire di conseguenza.

public override void Initialize()
{
  ClearCanvas();
  physicsSimulator = new PhysicsSimulator(new Vector2(0, 0));
  Body rectangleBody = BodyFactory.Instance.CreateRectangleBody(physicsSimulator, 128, 128, 1);
  rectangleBody.Position = new Vector2(256, 384);

  Geom rectangleGeom = GeomFactory.Instance.CreateRectangleGeom(physicsSimulator, rectangleBody, 128, 128);
  rectangleGeom.CollisionGroup = 15;

  Body circleBody = BodyFactory.Instance.CreateCircleBody(physicsSimulator, 64, 1);
  circleBody.Position = new Vector2(725, 384);

  Geom circleGeom = GeomFactory.Instance.CreateCircleGeom(physicsSimulator, circleBody, 64, 20);
  circleGeom.CollisionGroup = 14124;
   
  AddRectangleToCanvas(rectangleBody, new Vector2(128, 128));
  AddCircleToCanvas(circleBody, 64);
   
  base.Initialize();
}

Con ClearCanvas viene pulito il piano di simulazione (Canvas) eliminando eventuali corpi ivi presenti. Viene creato quindi un oggetto di tipo PhysicsSimulator che rappresenta il motore di simulazione dell'engine che gestirà le proprietà fisiche degli oggetti.

La classe PhysicsSimulator ha due costruttori, uno senza parametri, che specifica la creazione di una simulazione senza la forza di gravità, ed uno che invece permette di specificare un oggetto Vector per definire una forza di gravità da applicare a tutti gli oggetti presenti nel Canvas.

In questo esempio sebbene sia stato specificato un vettore nel costruttore del PhysicsSimulator, non sarà applicata alcuna forza di gravità in quanto il vettore è nullo (0,0). Una prova interessante potrebbe essere quindi quella di specificare un vettore non nullo nel costruttore, ad esempio: Vector2(0,20) per simulare una forza di gravità verso il basso, oppure Vector2(20,0) per simulare una forza verso destra.

Successivamente viene creato un oggetto di tipo Body avente forma rettangolare (CreateRectangleBody) e subito dopo a questo oggetto viene applicata una geometria anch'essa rettangolare che servirà per dargli consistenza (CreateRectangleGeom).

Procedimento analogo viene seguito per la creazione dell'oggetto di forma tondeggiante attraverso l'utilizzo del metodo CreateCircleBody (per il corpo) e del metodo CreateCircleGeom (per la geometria). Se vogliamo possiamo imprimere ad uno dei due oggetti un moto di rotazione con il metodo ApplyAngularImpulse, ad esempio per far roteare l'oggetto rettangolare possiamo aggiungere: rectangleBody.ApplyAngularImpulse(4000);.

Dopo aver creato gli oggetti il passo successivo consiste nell'aggiungere questi oggetti al piano 2D di simulazione, ovvero il Canvas. I metodi AddRectangleToCanvas e AddCircleToCanvas fanno proprio questo.

Questi semplici passi permettono già di verificare il funzionamento dell'Engine, non ci resta quindi che sperimentare la creazione di nuove forme e variare i vari parametri relativi ai vettori di ciascun oggetto per applicare ad esempio la forza di gravità. Farseer Physics è un prodotto ancora in fase di sviluppo, anche se, nell'attesa di una versione definitiva, possiamo sperimentare nuovo codice prendendo spunto dalle demo incluse nel pacchetto.

Ti consigliamo anche