# Programmation JavaFX/Formes 3D

* Base commune
** Introduction
** Composants d'une application JavaFX
* Interface graphique (2D)
** Classes 2D
* Scene 3D
** Formes 3D
** Apparence
** Interactions
* Media
** Jouer une vidéo ou un son
* Outils
** Scene Builder
* Base commune
** Introduction
** Composants d'une application JavaFX
* Interface graphique (2D)
** Classes 2D
* Scene 3D
** Formes 3D
** Apparence
** Interactions
* Media
** Jouer une vidéo ou un son
* Outils
** Scene Builder
[ Modifier le sommaire ]
Une scène en 3D est composée de formes 3D, de source lumineuses et d'une caméra définissant le point de vue de la scène.

## Coordonnées et orientation des axes 3D

Les coordonnées d'un point ou d'une forme est un ensemble de 3 valeurs de type double, nommées X, Y et Z.
L'orientation par défaut des axes est le suivant :
* L'axe X est orienté de la gauche vers la droite : une valeur plus élevée de X donne une position relative plus à droite.
* L'axe Y est orienté du haut vers le bas.
* L'axe Z est orienté du plus proche au plus loin.

## Classe de base

La classe Shape3D est la classe de base des formes 3D. Elle définit les méthodes communes à toutes les formes, permettant de les placer/déplacer et de les orienter.
La position initiale à la création d'une forme 3D est (0,0,0).

### setTranslateX(double)

    Incrémente la coordonnée X du nœud.

### setTranslateY(double)

    Incrémente la coordonnée Y du nœud.

### setTranslateZ(double)

    Incrémente la coordonnée Z du nœud.
La classe Shape3D a 4 implémentations concrètes :
* La classe Sphere
* La classe Cylinder
* La classe Box représente une boîte ou parallélépipède rectangle ou pavé droit.
* La classe MeshView permet de définir une forme particulière à partir d'une instance de la classe abstraite Mesh. La classe abstraite Mesh possède la sous-classe TriangleMesh comme implémentation concrète, définissant la forme à partir de triangles.
Les sous-classes présentées ci-dessous ont des caractéristiques communes :
* Par défaut, les formes sont centrées sur le point d'origine (0,0,0).
* Si les dimensions ne sont pas spécifiées (constructeur sans arguments), les dimensions par défaut sont définies par une boîte 2x2x2.

## Sphère (classe Sphere)

Les paramètres définissant une sphère sont les suivants (même ordre que les arguments des constructeurs de la classe) :

### double radius

    (Optionnel) Rayon de la sphère. La valeur par défaut est 1.0.

### int divisions

    (Optionnel) Nombre de divisions de la circonférence. La valeur par défaut est 64.

### Exemple
## Cylindre (classe Cylinder)

Les paramètres définissant un cylindre sont les suivants (même ordre que les arguments des constructeurs de la classe) :

### double radius

    (Optionnel) Rayon du cylindre. La valeur par défaut est 1.0.

### double height

    (Optionnel) Hauteur du cylindre. La valeur par défaut est 2.0.

### int divisions

    (Optionnel) Nombre de divisions de la circonférence. La valeur par défaut est 64.
L'orientation initiale du cylindre suit l'axe Y ; les faces circulaires sont donc perpendiculaire à l'axe Y.

### Exemple
## Boîte (classe Box)

Les paramètres définissant une boîte sont les suivants (même ordre que les arguments des constructeurs de la classe) :

### double width

    (Optionnel) Largeur de la boîte (axe X). La valeur par défaut est 2.0.

### double height

    (Optionnel) Hauteur de la boîte (axe Y). La valeur par défaut est 2.0.

### double depth

    (Optionnel) Profondeur de la boîte (axe Z). La valeur par défaut est 2.0.

### Exemple
## Forme triangulée

Une forme triangulée est définie avec un objet de class TriangleMesh. Le seul constructeur à appeler n'a aucun paramètres. Il faut ensuite remplir les listes de points, de faces triangulaires et les points de texture.
Méthodes de la classe TriangleMesh:

### getTexCoords

    Retourne la liste modifiable (float) des points (U,V) pour les textures.

### getPoints

    Retourne la liste modifiable (float) de tous les sommets.

### getFaces

    Retourne la liste modifiable (int) des index des sommets de chaque face.

### getFaceSmoothingGroups

    Retourne la liste modifiable (int) des identifiants de face. La même valeur signifiant qu'il s'agit de la même face. Ceci est utilisé pour le rendu continu des faces.

### Exemple

Il faut ensuite encapsuler la triangulation dans une forme :

## Sources de lumière

Par défaut, la scène n'a aucune source lumineuse. Le rendu serait donc de la couleur de fond de la scène.
Une source lumineuse a une couleur filtrant celle des objets, une intensité, et une position.
JavaFX a deux types de sources lumineuses :

### Lumière ambiante (AmbientLight)

    Une source lumineuse sans position, se diffusant sur toute la scène avec la même intensité.

### Lumière ponctuelle (PointLight)

    Une source lumineuse avec position, dont la luminosité décroit avec l'augmentation de la distance.
Il faut également définir pour chaque source lumineuse, la liste des objets éclairés par celle-ci.

### Exemple
## Caméra

La caméra (classe Camera) représente le point de vue d'affichage de la scène : position et orientation. Pour une représentation en 3D, la sous-classe PerspectiveCamera est utilisée.

### setNearClip(float)

    Définit la distance minimale pour le rendu des objets.

### setFarClip(float)

    Définit la distance maximale pour le rendu des objets.

### getTransforms

    Liste modifiable des transformations (translation, rotation).

## Construction de la scène

La scène est construite en spécifiant le nœud racine regroupant les éléments de la scène.

### Exemple

Il ne manque que la scène constituée des éléments vus précédemment.

## Code complet

L'apparence des objets sera améliorée dans le chapitre suivant.