XNA Atelier 11. Introduction à la programmation 3D. Développement de programmes. dans un environnement graphique 420-203-RE. Auteur Vincent Echelard



Documents pareils
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP1 : Initiation à Java et Eclipse

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Bases Java - Eclipse / Netbeans

TD/TP PAC - Programmation n 3

Mise en scène d un modèle dans l espace 3D

Construire des plug-ins pour SAS Management Console SAS 9.1

Flex. Lire les données de manière contrôlée. Programmation Flex 4 Aurélien VANNIEUWENHUYZE

Objets et Programmation. origine des langages orientés-objet

Programmer en JAVA. par Tama

Package Java.util Classe générique

Programmation Par Objets

Une introduction à Java

Chapitre 10. Les interfaces Comparable et Comparator 1

PROJET DE MODELISATION CASERNE SERGEANT BLANDAN

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TD/TP PAC - Programmation n 3

Tp 1 correction. Structures de données (IF2)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

.NET - Classe de Log

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Auto-évaluation Programmation en Java

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

TP Blender n 2 : Importation d un modèle SketchUp et animation

Rapport de Mini-Projet en ArcGIS Engine

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Programmation en Java IUT GEII (MC-II1) 1

Le programme détaillé. Salle A07 Salle A06 Salle A04. Initiation à DirectX. Création de Mods Minecraft

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Classes et Objets en Ocaml.

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Virtual Universe aperçu numéro 1

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Création d objet imbriqué sous PowerShell.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Héritage presque multiple en Java (1/2)

Les structures. Chapitre 3

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

1. Installation d'un serveur d'application JBoss:

pcon.planner 6 Préparer et présenter une implantation en toute simplicité

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

WebParts. Version 1.0

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Construire une application marketing Facebook sur la plateforme Windows Azure

Programmation par les Objets en Java

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Once the installation is complete, you can delete the temporary Zip files..

MEGA ITSM Accelerator. Guide de démarrage

Applet pour visualiser les variables «automate» notifiées

Importation et exportation de contenu

Une introduction à la technologie EJB (2/3)

Langage Java. Classe de première SI

imovie 11 Créer un projet Menu / Fichier / Nouveau projet... Choisir le format : Standard (16/9). Importer des «!plans!» 1.

BIRT (Business Intelligence and Reporting Tools)

Corrigés des premiers exercices sur les classes

TP1. Outils Java Eléments de correction

COURS AUTOCAD. Création et utilisation des blocs. b leclerc. ERP Jean Moulin METZ

MAÎTRISE DE L ENVIRONNEMENT WINDOWS VISTA

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Premiers Pas en Programmation Objet : les Classes et les Objets

GOL502 Industries de services

Nouveautés FDS Pour créer des équipements 2D et les publier à partir d'autocad

Education Delivery Intelligent Tool

Guide de l utilisateur. Faites connaissance avec la nouvelle plateforme interactive de

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

TP JAVASCRIPT OMI4 TP5 SRC

1. Base de données SQLite

4. Groupement d objets

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Rafraichissement conditionné d'une page en.net

Programme Compte bancaire (code)

Création d un service web avec NetBeans 5.5 et SJAS 9

MEGA ITSM Accelerator. Guide de Démarrage

SQL Data Export for PS/PSS

PROPOSITION. One ID. Références développement. Version 1.0 Juillet One ID

Développer des Applications Internet Riches (RIA) avec les API d ArcGIS Server. Sébastien Boutard Thomas David

Design patterns. Design patterns - définition. Design patterns - avantages

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO

as Architecture des Systèmes d Information

2. Comprendre les définitions de classes

OUTIL DE TRAVAIL COLLABORATIF

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

TUTORIAL Microsoft Project 2010 Fonctionalités de base

Notions fondamentales du langage C# Version 1.0

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Chapitre 3 : Repères et positionnement 3D

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Transcription:

XNA Atelier 11 Introduction à la programmation 3D Auteur Vincent Echelard Table des matières A. BUT DE L ATELIER... 2 B. MODÈLES 3D... 2 1. Introduction... 2 2. Ajout d un modèle 3D au projet... 3 C. MÉLANGER L AFFICHAGE 2D ET L AFFICHAGE 3D... 4 1. Introduction... 4 2. Stratégie de gestion de l affichage... 4 3. La classe Afficheur3D... 5 D. CAMÉRA... 6 1. Introduction... 6 2. La classe Caméra... 6 3. La classe CaméraFixe... 7 E. AFFICHAGE D UN MODÈLE 3D... 8 1. Introduction... 8 2. La classe ObjetDeBase... 8 F. TRAVAIL À RÉALISER... 10 420-203-RE Développement de programmes dans un environnement graphique

A. But de l atelier Cet atelier vous permettra de vous initier à certains aspects du développement d une application 3D avec XNA. Pour commencer : 1. Téléchargez les différents fichiers d'archives relatifs à l atelier 11 sur le site Web du cours. 2. Décompressez les fichiers d archives. 3. Ouvrez le projet de base B. Modèles 3D 1. Introduction En infographie 3D, la modélisation 3D est le processus d'élaboration d'une représentation mathématique d'une surface tridimensionnelle d un l'objet par le biais d un logiciel spécialisé. Le résultat obtenu est appelé un modèle 3D. XNA reconnaît de prime abord deux formats de modèle 3D. Soit le format FBX et le format X. Le format FBX a été développé par la firme canadienne Kaydara et est maintenant la propriété de la firme Autodesk qui est spécialisée dans les logiciels de dessin et de conception assistée par ordinateur tels Maya et 3D Studio MAX qui sont les logiciels les plus utilisés en modélisation 3D. Ces logiciels permettent d exporter les modèles 3D en format FBX. Le format X a été développé par la firme américaine Microsoft et il est lié à la bibliothèque graphique DirectX. Il est toutefois théoriquement possible de développer des outils d importation qui permettraient d utiliser des fichiers ayant un format standard tel BLEND (Blender), OBJ (Wavefront), MAX (3D Studio MAX), ou MA (Maya). Auteur : Vincent Echelard, 2015 Page 2

2. Ajout d un modèle 3D au projet Les modèles 3D, comme tous les autres types de ressources doivent être ajoutés dans le Content de notre projet, dans un répertoire approprié qui ici portera le nom de Models. Pour cet atelier, nous allons ajouter le modèle «Ship.fbx» que vous trouverez dans le fichier d archives contenant les assets de l atelier 11. Une particularité importante à souligner en ce qui concerne l ajout des modèles 3D, c est qu il faut généralement également ajouter le ou les fichiers contenant les diverses textures qui seront appliquées sur le modèle (voir figure 1). Ces fichiers de texture devront, habituellement, être placés dans le même répertoire que le modèle. Il ne faut toutefois pas que ces textures apparaissent dans l explorateur de solution (voir figure 2). Le modèle 3D La texture Figure 1. Ajout du modèle (et de sa texture) au projet Figure 2. Exclure la texture du projet Auteur : Vincent Echelard, 2015 Page 3

C. Mélanger l affichage 2D et l affichage 3D 1. Introduction Dans une application 3D classique, il est fréquent de devoir également afficher certains éléments 2D. En XNA, cela comporte certaines difficultés qui sont inhérentes au fait que les paramètres graphiques liés à l affichage 2D sont différents de ceux associés à l affichage 3D. C est pourquoi il nous faudra mettre en place une stratégie qui nous permettra de limiter les interactions négatives entre les deux modes d affichage. 2. Stratégie de gestion de l affichage Dans un affichage mixte 2D/3D, les problèmes surviennent lorsque l on passe de l affichage 2D à l affichage 3D. En effet, lors du passage du 3D au 2D, le framework XNA initialise correctement les paramètres graphiques pour permettre l affichage des composants 2D. Toutefois, lors du passage du 2D au 3D, notre application doit prendre en charge l initialisation des paramètres graphiques, sans quoi nos éléments 3D ne seront pas correctement affichés. La stratégie que nous devons mettre en place est relativement simple. Nous allons créer, au sein de notre liste de composants, trois groupes distincts de composants. Le premier sera constitué des composants liés à l affichage 2D de l arrière-plan (background), le second sera formé des composants liés à l affichage 3D et le troisième groupe sera constitué des composants qui s occuperont de l affichage 2D de l avant-plan (foreground). De plus, nous allons nous assurer que le premier composant du second groupe se charge de réinitialiser correctement les paramètres graphiques nécessaires à l affichage 3D. Dans nos ateliers nous confierons cette tâche à un composant nommé «Afficheur3D». Auteur : Vincent Echelard, 2015 Page 4

3. La classe Afficheur3D public class Afficheur3D : Microsoft.Xna.Framework.DrawableGameComponent InputManager GestionInput get; set; DepthStencilState JeuDepthBufferState get; private set; RasterizerState JeuRasterizerState get; private set; BlendState JeuBlendState get; private set; bool estaffichéenwireframe; bool EstAffichéEnWireframe get return estaffichéenwireframe; set JeuRasterizerState = new RasterizerState(); estaffichéenwireframe = value; JeuRasterizerState.CullMode = CullMode.CullCounterClockwiseFace; JeuRasterizerState.FillMode = estaffichéenwireframe? FillMode.WireFrame : FillMode.Solid; Game.GraphicsDevice.RasterizerState = JeuRasterizerState; public Afficheur3D(Game jeu) : base(jeu) public override void Initialize() JeuDepthBufferState = new DepthStencilState(); JeuDepthBufferState.DepthBufferEnable = true; JeuRasterizerState = new RasterizerState(); JeuRasterizerState.CullMode = CullMode.CullCounterClockwiseFace; JeuBlendState = BlendState.Opaque; base.initialize(); protected override void LoadContent() GestionInput = Game.Services.GetService(typeof(InputManager)) as InputManager; public override void Update(GameTime gametime) GestionClavier(); public override void Draw(GameTime gametime) GraphicsDevice.DepthStencilState = JeuDepthBufferState; GraphicsDevice.RasterizerState = JeuRasterizerState; GraphicsDevice.BlendState = JeuBlendState; GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap; void GestionClavier() if (GestionInput.EstNouvelleTouche(Keys.F)) EstAffichéEnWireframe =!EstAffichéEnWireframe; Auteur : Vincent Echelard, 2015 Page 5

D. Caméra 1. Introduction Dans cet atelier, nous allons implémenter une caméra fixe. Pour ce faire, nous allons créer une hiérarchie de classe dont le sommet sera occupé par une classe abstraite, la classe Caméra, qui servira de Parent aux différentes caméras fixe, subjective, objective, etc. 2. La classe Caméra public abstract class Caméra : Microsoft.Xna.Framework.GameComponent protected const float OUVERTURE_OBJECTIF = MathHelper.PiOver4; //45 degrés protected const float DISTANCE_PLAN_RAPPROCHÉ = 0.001f; protected const float DISTANCE_PLAN_ÉLOIGNÉ = 100000; public Matrix Vue get; protected set; public Matrix Projection get; protected set; // Propriétés relatives au "Point de vue" public Vector3 Position get; protected set; public Vector3 Cible get; protected set; public Vector3 OrientationVerticale get; protected set; // Propriétés relatives au "Volume de visualisation" protected float AngleOuvertureObjectif get; set; protected float AspectRatio get; set; protected float DistancePlanRapproché get; set; protected float DistancePlanÉloigné get; set; public Caméra(Game jeu) : base(jeu) private void CréerPointDeVue() //Création de la matrice de vue (point de vue) Vue = Matrix.CreateLookAt(Position, Cible, OrientationVerticale); protected virtual void CréerPointDeVue(Vector3 position, Vector3 cible) //Initialisation des propriétés de la matrice de vue (point de vue) Position = position; Cible = cible; OrientationVerticale = Vector3.Up; //Création de la matrice de vue (point de vue) CréerPointDeVue(); Auteur : Vincent Echelard, 2015 Page 6

protected virtual void CréerPointDeVue(Vector3 position, Vector3 cible, Vector3 orientationverticale) //Initialisation des propriétés de la matrice de vue (point de vue) Position = position; Cible = cible; OrientationVerticale = orientationverticale; CréerPointDeVue(); //Création de la matrice de vue (point de vue) private void CréerVolumeDeVisualisation() //Création de la matrice de projection (volume de visualisation) Projection = Matrix.CreatePerspectiveFieldOfView(AngleOuvertureObjectif, AspectRatio, DistancePlanRapproché, DistancePlanÉloigné); protected virtual void CréerVolumeDeVisualisation(float angleouvertureobjectif, float distanceplanrapproché, float distanceplanéloigné) //Initialisation des propriétés de la matrice de projection (volume de visualisation) AngleOuvertureObjectif = angleouvertureobjectif; AspectRatio = Game.GraphicsDevice.Viewport.AspectRatio; DistancePlanRapproché = distanceplanrapproché; DistancePlanÉloigné = distanceplanéloigné; CréerVolumeDeVisualisation(); //Création de la matrice de projection (volume de visualisation) protected virtual void CréerVolumeDeVisualisation(float angleouvertureobjectif, float aspectratio, float distanceplanrapproché, float distanceplanéloigné) //Initialisation des propriétés de la matrice de projection (volume de visualisation) AngleOuvertureObjectif = angleouvertureobjectif; AspectRatio = aspectratio; DistancePlanRapproché = distanceplanrapproché; DistancePlanÉloigné = distanceplanéloigné; //Création de la matrice de projection (volume de visualisation) CréerVolumeDeVisualisation(); 3. La classe CaméraFixe public class CaméraFixe : Caméra public CaméraFixe(Game jeu, Vector3 positioncaméra, Vector3 cible, Vector3 orientation) : base(jeu) // Création de la matrice de vue CréerPointDeVue(positionCaméra, cible, orientation); // Création de la matrice de projection (volume de visualisation) CréerVolumeDeVisualisation(Caméra.OUVERTURE_OBJECTIF, Caméra.DISTANCE_PLAN_RAPPROCHÉ, Caméra.DISTANCE_PLAN_ÉLOIGNÉ); Auteur : Vincent Echelard, 2015 Page 7

E. Affichage d un modèle 3D 1. Introduction Dans cet atelier, l affichage d un modèle 3D sera basé sur la classe ObjetDeBase qui nous permettra de gérer les propriétés de base d un modèle 3D, son chargement et son affichage. 2. La classe ObjetDeBase public class ObjetDeBase : Microsoft.Xna.Framework.DrawableGameComponent string NomModèle get; set; RessourcesManager<Model> GestionnaireDeModèles get; set; Caméra CaméraJeu get; set; protected float Échelle get; set; protected Vector3 Rotation get; set; protected Vector3 Position get; set; protected Model Modèle get; private set; protected Matrix[] TransformationsModèle get; private set; protected Matrix Monde get; set; public ObjetDeBase(Game jeu, String nommodèle, float échelleinitiale, Vector3 rotationinitiale, Vector3 positioninitiale) : base(jeu) NomModèle = nommodèle; Position = positioninitiale; Échelle = échelleinitiale; Rotation = rotationinitiale; public override void Initialize() CalculerMonde(); base.initialize(); private void CalculerMonde() Monde = Matrix.Identity; Monde *= Matrix.CreateScale(Échelle); Monde *= Matrix.CreateFromYawPitchRoll(Rotation.Y, Rotation.X, Rotation.Z); Monde *= Matrix.CreateTranslation(Position); protected override void LoadContent() CaméraJeu = Game.Services.GetService(typeof(Caméra)) as Caméra; GestionnaireDeModèles = Game.Services.GetService(typeof(RessourcesManager<Model>)) as RessourcesManager<Model>; Modèle = GestionnaireDeModèles.Find(NomModèle); TransformationsModèle = new Matrix[Modèle.Bones.Count]; Modèle.CopyAbsoluteBoneTransformsTo(TransformationsModèle); public override void Draw(GameTime gametime) Auteur : Vincent Echelard, 2015 Page 8

foreach (ModelMesh maille in Modèle.Meshes) Matrix mondelocal = TransformationsModèle[maille.ParentBone.Index] * GetMonde(); foreach (ModelMeshPart portiondemaillage in maille.meshparts) BasicEffect effet = (BasicEffect)portionDeMaillage.Effect; effet.enabledefaultlighting(); effet.projection = CaméraJeu.Projection; effet.view = CaméraJeu.Vue; effet.world = mondelocal; maille.draw(); public virtual Matrix GetMonde() return Monde; Auteur : Vincent Echelard, 2015 Page 9

F. Travail à réaliser Vous devez créer un nouveau composant nommé ObjetDeDémo, qui nous permettra d effectuer diverses transformations sur le modèle affiché. Ce composant devra avoir un comportement similaire à celui de l exemple disponible sur le site Web. Il devra donc répondre aux commandes énumérées dans le tableau ci-dessous : Touche du clavier Action 1 Démarrer/arrêter la rotation sur l axe des Y (yaw) 2 Démarrer/arrêter la rotation sur l axe des X (pitch) 3 Démarrer/arrêter la rotation sur l axe des Z (roll) <espace> Rétablir les angles de rotation initiaux + Agrandir le modèle (maximum 100%) - Réduire le modèle (minimum 0.5%) De plus, la signature du constructeur de votre composant devra être la suivante : public ObjetDeDémo(Game jeu, String nommodèle, float échelleinitiale, Vector3 rotationinitiale, Vector3 positioninitiale, float intervallemaj) G. Modalité de remise Vous devrez remettre, par Colnet, la version modifiée du composant ObjetDeDémo d ici minuit le mercredi 11 novembre 2015. Votre fichier d archives sera nommé de la façon habituelle, soit «Atelier 11 - Nom Prénom». Pour ceux qui décideraient de faire le travail en équipe, le nom prendra la forme «Atelier 11 - Nom1 Prénom1 - Nom2 Prénom2». Auteur : Vincent Echelard, 2015 Page 10