Distributed interactive simulation

Description

Ce projet est un projet d'école qui a pour but de d'implémenter le DIS (http://en.wikipedia.org/wiki/Distributed_Interactive_Simulation).
Le coeur de cette source est un dll écrite en C permettant la gestion complète des entités simulées.(déplacement, colision, etc) en envoyant ou récupérant ces info sur votre réseau.

Source compléte à télécharger ici: http://vadech.thais-soft.com/DIS/

En plus de cette dll, nous avons développer des outils et quelque applications de démonstration:
-un espion 2d permettant d'afficher toutes les entitées présente sur le réseau (écrit en Java)
-un espion sous forme d'analyser de trame (style ethereal) (écrit en .NET)
-un afficher 3D utilisant le X3D/VRML (écrit en Java)
-un générateur de carte permettant de jouer avec le DIS (en 2D et 3D) (écrit en Java).
-une passerelle TCP/IP permettant des jouer avec des sites distants
-une application voiture simulant des voitures roulant sur des routes
-une application feux rouges simulant des feux
-une application camion
-etc...
Toutes ces applications ont été inséré dans ce zip exécutable. Il contient aussi les source afin que vous puissiez vous amuser avec.
Je vous invite à essayer des créer un application gérant des entité quelconque. Vous vous rendrez compte que grâce à l'utilisation de la dll, cela s'avère très simple. La dll est attaquable par n'importe quel language capable d'utiliser les dll (java, c++, .NET, etc...)
Je suis désolé pour le manque de documentation, mais se n'est pas mon fort.
Je m'excuse ausi pour la non portabilité sous linux et mac mais ceci reste possible. Si qq veut s'y coller...

Source / Exemple :


Source compléte à télécharger ici: http://vadech.thais-soft.com/DIS/
Celle-ci fait 38M dc je ne peux donc pas la déposer ici.
Ce dossier contient les source sous forme d'un zip auto-extractable et un applet permettant de gérer à distance un "serveur" DIS.

Le zip contient les dossiers :
	1. Afficheur3D : Programme de visualisation en 3D des entités.
	2. Cartes : Contient des cartes au format PLC.
	3. DisApi : Les DLL DisApi et les ressources associées.
		3.1. DisApi\DisApiSrc : Le Workspace des sources des DLLs et projets C#.
	4. DisSniffer : Le Sniffeur DIS.
	5. DotNetFramework2.0
	5. EditeurDeCarte : Permet de générer les fichiers PLC et WRL.
	6. Espion2D : Equivalent de l'afficheur 3D sauf que c'est en 2D.
	7. Feux : Programme de gestion des feux avec plan de feux automatique.
	8. jdk1.5.0_12 : Compilateur et Environnement d'éxécution JAVA.
	9. MobileCSharp : Un programme écrit en C# faisant bouger une entité en 
		utilisant la classe Entity de la DLL.
	10. MySql : Dossier contenant le Jar permettant de se connecter à une base 
		de données MySql
	11. vcredist_8.0 : Contient l'installation du runtime Visual Studio C++ 8.0
	12. VisuDis : Contient le Jar permettant d'avoir la même Visualisation dans 
		tous les programmes JAVA
	13. Voiture : Programme permettant de simuler une voiture.
	14. Xj3D : Contient les librairie permettant de faire la visualisation 3D

Il contient aussi les fichiers :
	15. Afficheur3D.bat : Lanceur de l'afficheur 3D.
	16. DisApi.bat : Ne pas exécuter ce fichier. Il permet de positionner des 
		variables d'environnements commun à tous les programmes.
	17. DisSniffer.bat : Lanceur du Sniffeur C#.
	18. EditeurDeCarte.bat : Lanceur de l'éditeur de carte.
	19. Espion2D : Lanceur de l'Espion2D.
	20. Feux.bat : Lanceur du programmes de gestionnaire de feux.
	21. MobileCSharp.bat : Lanceur du programmes MobileCSharp.
	22. README.TXT : Ce fichier.
	22. Voiture.bat : Lanceur du programmes de gestion des voitures.
	

Tout les dossier contenant un programme JAVA contienne un dossier bin et un 
dossier src. Le dossier bin contient les fichiers compilés et le dossier src
contient les sources du programme.

I] Installation & éxécution

Tout d'abord, cette procédure n'est certifié que sous WindowsXP 32bit.

1. Cette procédure d'intallation ne depend d'aucun composants externe pour 
	l'éxécution des programmes.

2. Il faut installer les runtimes de Visual Studio C++ 8.0. Pour célà, il faut
	éxécuter le fichier "vcredist_8.0_x86.exe" se trouvant dans le dossier 
	"vcredist_8.0".

3. Lancer le fichier bat correspondant au programme que vous voulez éxécuter.
	Attention ne pas éxécuter le fichier DisApi.bat. Ce fichier n'est pas 
	destiné à être éxécuté.

II] Dévéloppement.

Cette section n'a rien d'officielle et ne constitué en rien la documentation 
officielle de la librairie DisApi.

1. Projet CSharp
	Il faut inclure le fichier "CsDisApiLib.dll" se trouvant dans le dossier
	"DisApi" dans les réferences de votre 
	projet.
	
2. Projet Java
	Créer un projet Java (Eclipse ou autre) et ajouter le fichier "JDisApi.jar"
	se trouvant dans le dossier "DisApi" dans le ClassPath.
	Option -classpath pour la compilation en ligne de commande.
	
3. La librairie est constituée de 4 classes principales : 
	1.1 DisApi : Classe "passerelle" entre la couche applicatif et la dll.
	1.2 DisMsgListener : Interface permettant de recevoir les DIS messages recu.
	1.3 Entity : Classe representant une entité.
	1.4 Application : Classe qui gèrent une liste d'entité appartenant à la 
		même application.
		
	Toutes les classes de l'API appartiennent à l'espace de noms "CsDisApi" pour
	C# et JDisApi pour Java.
	
4. Etapes de dévélopement.
	Ces différentes étapes sont similaires pour Java ou C#.
	
	4.1 Récupérer l'instance de DisApi comme le montre cette exemple : 
		DisApi api = DisApi.getInstance();
		
		Et initialiser les paramètres Dis et réseau.
		
		api.setDisParameter(<numero d'exercise>, <numéro de site>);
		api.initNetwork(
			<adresse broadcast>, <port de broadcast>, 
			<adresse ip reception>, <port de reception>,
			<taille de buffer>);
			
		Ex : 
			api.setDisParameter(1, 1);
			api.initNetwork(
				"255.255.255.255", 3000,
				"", 3000,
				4000);
		
	4.2 Si l'on veut récupérer la liste des messages qui transitent sur le 
		réseau nous devons créer une classe héritant de la class DisMsgListener.
		Ex :
			// C#
			class MonListener : DisMsgListener {
				public void receiveDisMessage(DisMsgEvent msgEvent) {
					DisMessage msg = msgEvent.getMessage();
					// action à effectuer sur le message
				}
			}
			
			// Java
			class MonListener extends DisMsgListener {
				public void receiveDisMessage(DisMsgEvent msgEvent) {
					DisMessage msg = msgEvent.getMessage();
					// action à effectuer sur le message
				}
			}
			
	4.3 Création d'une entité.
		Pour créer une entité il faut créer une classe héritant de la classe 
		Entity.
		Ex : 
			// CSharp
			class MonEntité : Entity {
				
				public MonEntite() {
					
				}
				
				public void activer(int laps) {
					// action à effectuer
					// laps définit le temps entre deux appelle à laps
				}
			}
			
			// Java
			class MonEntité extends Entity {
				
				public MonEntite() {
					
				}
				
				public void activer(int laps) {
					// action à effectuer
					// laps définit le temps entre deux appelle à laps
				}
			}
			
		La classe Entity contient les méthodes : 
			mushort      getSiteId(); // retourne le siteId
			mushort      getAppId(); // retourne L'application Id
			mushort      getEntityId(); // retourne L'entity Id
			Application* getApplication(); // retourne l'application 
								correspondant a cette entite

			// Retourne les coordonées de l'entité
			double getX();
			double getY();
			double getZ();

			// Retourne les composantes de la vitesse
			float getVx();
			float getVy();
			float getVz();
			// Retourne la vitesse
			float getV();

			// Retourne les composantes de l'acceleration
			float getAx();
			float getAy();
			float getAz();
			// Retourne l'acceleration
			float getA();

			// Retourne l'orientation de l'entité définit par la rotation 
			// par rapport au trois axes
			float getRotZ();
			float getRotY();
			float getRotX();
			
			// retourne le numéro d'apparence de l'objet.
			muint getAppearence();

			// modifier la position de l'objet
			void setX(double value);
			void setY(double value);
			void setZ(double value);

			// Modifié les composantes de la vitesse
			void setVx(float value);
			void setVy(float value);
			void setVz(float value);
			// Modifié les composantes de la vitesse selon l'orientation de 
			// l'entité
			void setV(float value);

			// de même que la vitesse pour l'acceleration
			void setAx(float value);
			void setsAy(float value);
			void setAz(float value);
			void setA(float value);

			// Modifié la rotation de l'objet et redefini les composantes de la
			// vitesse pour que la vitesse et l'acceleration soit identiques
			void setRotZ(float value);
			void setRotY(float value);
			void setRotX(float value);
			
			// modifier le numero d'apparence de l'objet
			void setAppearence(muint value);
			
	4.4 Pour que la dll envoie automatiquement les informations de l'entité,
		il faut qu'il soit ajouté dans une application comme ceci,
		Ex : 
			MonMobile mobile = new MonMobile();
			Application app3 = Application.getApplication(3);
			
			app3.addEntity(mobile);

Conclusion :


Merci de me tenir au courant si vous utilisez ce travail dans d'autre projet. Cela m'intéresse et nous ferai plaisir.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.