FireMonkey 3D

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Guide des applications FireMonkey


Initiation au 3D

FireMonkey présente les vues 2D des objets en espace 3D. Un TViewport3D affiche le contenu 3D dans une autre forme 2D, tandis qu'un TForm3D commence par le contenu 3D. 2D et 3D peuvent être imbriqués.

FireMonkey 3D utilise les bibliothèques spécifiques aux plates-formes, comme suit :

  • Pour Windows, la bibliothèque Direct3D (partie de DirectX ; fournie dans la portée d'unité Winapi)
  • Pour Mac, la bibliothèque OpenGL (fournie dans la portée d'unité Macapi)

Objets 3D

FireMonkey fournit plusieurs types d'objets 3D :

  • Formes 3D primitives comme TCube, TSphere et TCone.
  • TMesh pour les objets 3D complexes.
  • Objets 2D extrudés en 3D, comme TText3D. Les objets extrudés ont trois côtés : l'avant, avec la forme 2D originale ; l'arrière, une image miroir de cette forme, et l'axe de l'extrusion entre eux.
  • Objets 2D plats en espace 3D, comme TImage3D et TTextLayer3D.

Les objets sont positionnés en espace 3D avec les coordonnées X, Y et Z en utilisant un TPosition3D. En plus de la hauteur et de la largeur, ils ont aussi une profondeur. Les objets 2D plats en espace 3D sont arbitrairement fins avec une profondeur codée en dur de 0,01. Les objets 3D ont la rotation 3D et la mise à l'échelle. La position, la taille, la rotation et la mise à l'échelle sont toutes relatives au point central de l'objet.

Comme avec les contrôles 2D, tout contrôle 3D de FireMonkey peut être le parent de tout autre contrôle 3D. La rotation et la position d'un enfant sont relatives à son parent. Le déplacement ou la rotation d'un parent repositionnera sa sous-arborescence de composants. TLayout3D peut être utilisé comme un autre parent commun pour organiser les autres objets.

Tandis que les objets 2D arrangés sur une surface 2D nécessitent la notion d'ordre Z pour déterminer leur disposition, les objets de l'espace 3D sont ordonnés intrinsèquement, ainsi quand ils sont vus à partir d'un point d'observation donné, les objets proches occluent les objets lointains dans la même ligne de vue.

Caméras

Chaque vue d'espace 3D est contrôlée par une caméra. La position et l'orientation (rotation 3D) de la caméra déterminent ce que vous voyez. Il y a toujours la caméra de conception utilisée dans le Concepteur de fiches, et par défaut à l'exécution. Elle est directement située au-dessus de l'axe Z négatif (vers l'axe Y négatif), perpendiculaire au plan X-Z, avec un angle légèrement vers le bas, afin que la position 0,0,0 soit au centre de la vue. Pour utiliser une caméra différente, définissez la propriété UsingDesignCamera du TViewport3D ou du TForm3D sur False, et assignez un TCamera à la propriété Camera. Une scène peut avoir plusieurs caméras. Après l'affectation d'une autre caméra à la propriété Camera, vous devez appeler Repaint manuellement.

Le volume visible est un champ de vue, avec le plan proche légèrement en face de la caméra. Toute chose entre la caméra et cet avant-plan est coupée de la vue. L'angle du champ de vue est fixé verticalement : rendre la fenêtre / fiche plus haute rend chaque chose plus grande, tandis que la rendre plus large en montre plus sur les côtés. Les unités de la position et de la taille sont relatives à l'échelle du champ de vue.

Projection d'écran

En plus de la vue d'un objet (ou de l'absence de vue) déterminé par la caméra, un objet peut aussi être défini pour être vu quel que soit l'endroit où la caméra pointe, comme les indicateurs de statut fixes dans les jeux 3D. Cela est réalisé en changeant la propriété Projection de la valeur par défaut Camera en Screen, afin que :

  • Avec Position.Z à zéro :
    • XY 0,0 est le coin supérieur gauche, comme en 2D. La position 3D reflète toujours la position du centre de l'objet, pas sa position supérieure gauche comme en 2D.
    • Les dimensions Hauteur, Largeur et Profondeur sont rendues en pixels, peu importe comment le champ de vue est mis à l'échelle.
    • Puisque les unités sont rendues en pixels, les dimensions d'un objet utilisant la projection d'écran sont plus grandes que lors de l'utilisation de la projection de caméra afin d'apparaître à la même taille.
    • L'objet apparaît légèrement derrière l'avant-plan de découpage du champ de vue. Les objets utilisant la projection de caméra ont un petit intervalle où ils peuvent apparaître devant les objets projetés à l'écran avant d'être découpés par l'avant-plan.
  • Avec Position.Z supérieur à zéro (loin de la visionneuse) :
    • La taille rendue est plus petite.
    • La réduction de la vue éloigne l'objet, le rendant même plus petit.
    • L'agrandissement de la vue rapproche l'objet, le rendant plus grand.
  • Avec Position.Z inférieur à zéro (vers la visionneuse) :
    • La taille rendue est plus grande.
    • La réduction de la vue rapproche l'objet, le rendant même plus grand.
    • En le rapprochant trop (en réduisant la vue ou en définissant Position.Z directement), l'objet se déplacera au-delà de l'avant-plan du champ de vue, provoquant ainsi sa disparition.
    • L'agrandissement de la vue éloigne l'objet, le rendant plus petit.

Dans le Concepteur de fiches, changer la projection d'un objet recalcule sa position afin qu'il ne se déplace pas, et ajuste aussi la taille.

Perche de caméra

La visualisation d'un objet ou d'une scène à partir de n'importe quelle direction, contrôlée par l'utilisateur, est une application 3D courante. Bien que vous pouvez calculer la position et l'orientation afin d'obtenir l'angle de caméra adéquat, il est plus facile de créer une perche de caméra virtuelle :

  1. Créez un objet invisible, tel qu'un TDummy, au même emplacement que l'objet d'intérêt, ou au centre de la scène.
  2. Créez le TCamera en tant qu'enfant de l'objet.
    1. Définissez sa Position sur la distance désirée sur l'un des axes.
    2. Si nécessaire, définissez sa propriété RotationAngle afin que la caméra pointe le long de l'axe vers l'emplacement. Assurez-vous que la caméra n'est pas à 180 degrés.
  3. Vous pouvez maintenant faire une rotation de la caméra autour de l'objet, simplement en changeant la propriété RotationAngle de l'objet dummy. La caméra maintient la distance exacte et pointe automatiquement directement vers le centre.
  4. L'ajout d'une lumière en tant qu'enfant de la caméra maintiendra la distance et l'orientation de la lumière quand la caméra se déplace.

Luminosité

En général, un objet 3D est une masse noire commune, à moins qu'il ne comporte des lumières. Un ou plusieurs objets TLight définissent la lumière dans l'espace 3D, selon leur propriété LightType :

Directional
La lumière directionnelle est constante, à partir d'un angle donné. La lumière du soleil est un peu analogue : elle provient de très loin, ainsi pour n'importe quel endroit localisé sur la terre -- à quelques mètres près, pas des kilomètres -- tous les éléments sont éclairés de la même façon. La position d'une lumière directionnelle n'a pas de rapport avec son effet. Sa position est pertinente si vous essayez de cliquer dessus dans le Concepteur de fiches. Ce qui compte c'est la direction des points de lumière, définie par sa propriété RotationAngle, et la propriété RotationAngle de ses parents.
Point
Une lumière ponctuelle ressemble à une ampoule nue. Il rayonne dans toutes les directions, et diminue d'intensité avec la distance. Son RotationAngle est sans effet. Ce qui compte c'est sa position, qui est affectée par la position et la rotation de ses parents.
Spot
Une lumière projetée dépend à la fois de la position et de la rotation, et diminue d'intensité avec la distance.

Les objets 2D plats en espace 3D ne nécessitent pas de lumière, et ne sont pas affectés par la lumière. Ils apparaissent comme d'habitude avec une perspective 3D ajoutée.

Matériaux

La surface d'un objet FireMonkey 3D est définie par sa propriété material. Les matériaux FireMonkey 3D sont basés sur les shaders. Cela permet une variation illimitée de luminosité et de matériaux dans une application. La liste des matériaux disponibles se trouve dans la Palette d'outils sous la catégorie Matériaux. Chaque objet FireMonkey 3D dispose de la propriété MaterialSource, qui lie une source de matériau à l'objet en cours. Pour conserver une bibliothèque de matériaux, utilisez TMaterialBook. Pour utiliser un matériau unique, la source peut être liée à autant d'objets que nécessaire.

Les objets extrudés ont les propriétés MaterialShaftSource et MaterialBackSource supplémentaires. Chacune est de type TMaterialSource.

Pour contrôler comment un matériau d'objet apparaît sous l'influence de la lumière, liez-le à un TLightMaterialSource :

  • La couleur Emissive détermine si une surface émet sa propre lumière, ou brille. La valeur par défaut est null (noir, opacité zéro) : les objets ne brillent pas normalement, et requièrent la lumière pour être vus. En définissant une couleur, les surfaces sans lumière apparaissent avec cette couleur. En cas d'éclairage, la couleur Emissive est mélangée aux autres couleurs résultant de la lumière.
  • La couleur Ambient fournit une couleur de base aux surfaces afin qu'elles puissent être vues. Dans le monde réel, la lumière se reflète sur une surface à partir de nombreuses directions ; mais dans une scène 3D il serait difficile de définir toute cette lumière. Ainsi la couleur Ambient est activée par toute lumière de l'espace. Sans lumière, elle est sans effet. La surface est coloriée de façon assez uniforme dans cette couleur. Avec une lumière directionnelle -- qui n'a pas à pointer à la surface -- tout semble plat. Avec les lumières ponctuelles et projetées, la couleur s'atténue avec la distance.
  • La couleur Diffuse interagit directement avec la lumière, y compris l'angle de l'incidence. Sans lumière, elle est sans effet. Il est courant de définir Ambient et Diffuse sur la même couleur.
  • La couleur Specular simule une surface brillante, en reflétant la lumière à un angle spécifique, au lieu de diffuser la lumière dans de nombreux angles. Sans lumière, Specular est sans effet. La valeur par défaut est la couleur blanche pour reflèter la lumière sans altérer sa couleur.

Mélange 2D et 3D

Les objets 3D doivent être placés dans un conteneur 3D. Un objet 3D (tel que TCube) ne sera pas rendu s'il est placé directement dans un conteneur 2D (tel que TForm), mais il sera affiché dans la vue Structure en tant que contrôle enfant. Inversement, un objet 2D (tel que TButton) ne sera pas rendu s'il est placé directement dans un conteneur 3D (tel que TForm3D), mais il sera aussi affiché dans la vue Structure en tant que contrôle enfant. Deux classes permettent le mélange imbriqué de contenus 2D et 3D :

  • TLayer3D est un objet 3D qui contient un contenu 2D. Il ressemble à une feuille rectangulaire qui réside dans un espace 3D.
  • TViewport3D est un objet 2D qui contient un contenu 3D. Comme TForm3D, c'est une "fenêtre" dans un espace 3D.

Vous pouvez imbriquer ces conteneurs. Par exemple, vous pouvez avoir une hiérarchie d'objets telle que :

  • TForm3D
    • TCube
    • TLayer3D
      • TButton
      • TViewport3D
        • TCube

De plus, quelques classes hébergent directement du contenu 2D dans un espace 3D :

  • TTextLayer3D affiche du texte.
  • TImage3D affiche des images bitmap.
  • TVideo3D affiche de la vidéo.

Importation de modèles 3D

Le framework FireMonkey offre le support d'importation des modèles 3D. Le modèle 3D peut être rendu seulement dans un conteneur 3D. Pour importer un modèle 3D, utilisez des objets TModel3D. Vous trouverez TModel3D dans la Palette d'outils. Pour charger un objet, utilisez la propriété MeshCollection du TModel3D. Les fichiers 3D supportés sont .obj, .dae et .ase.

Les modèles sont importés et affichés avec la texture. En l'absence de lumière sur la scène, la texture n'est pas visible. Un modèle importé est manipulable d'une façon élémentaire (rotation, déplacement, mise à l'échelle et redimensionnement) comme tout autre objet 3D.

L'affichage correct d'un modèle chargé dépend de la cohérence et de la correction du fichier chargé.

Voir aussi

Exemples de code