Retour à l'accueil

Rendu 3D FXGL : caméra et shaders JavaFX

L'article analyse l'utilisation de FXGL et JavaFX 3D pour des prototypes avec modélisation système. Décrit le contrôle de la caméra, les matériaux PhongMaterial, l'import de modèles, les shaders GLSL et l'intégration RepeatCore. Limitations clés mises en évidence : absence d'ombres et de physique.

3D dans FXGL : de la caméra à la modélisation système
Advertisement 728x90

Rendu 3D avec FXGL et JavaFX : Fonctionnalités, Limites et Intégration RepeatCore

La caméra 3D de JavaFX offre un contrôle total sur les paramètres de vue. Ajuster le champ de vision (FOV) permet de modifier dynamiquement l'angle de vue grâce aux bindings :

camera3D.getPerspectiveCamera().fieldOfViewProperty().bind(cam_val);

Régler les plans de clipping proche et lointain optimise le rendu en éliminant les objets invisibles. Les transformations Translate et Rotate gèrent les déplacements et rotations de la caméra.

Pour attacher la caméra à un objet comme une voiture, calculez la position ainsi :

Google AdInline article slot
var distanceToCamera = -8;
var pos = entity.getPosition3D().subtract(entity.getTransformComponent().getDirection3D().multiply(distanceToCamera));
transform.setPosition3D(pos);
transform.lookAt(entity.getPosition3D());
transform.setY(entity.getY() + CAMERA_HEIGHT_OFFSET);

Un mouvement fluide s'obtient par interpolation avec des facteurs d'easing :

double smoothXY = 0.2;
double smoothZ = 0.2;

var distanceToCamera = -8;
var targetPos = entity.getPosition3D().subtract(
        entity.getTransformComponent().getDirection3D().multiply(distanceToCamera)
);

double newX = cameraPos.getX() + (targetPos.getX() - cameraPos.getX()) * smoothXY;
double newY = cameraPos.getY() + (targetPos.getY() - cameraPos.getY()) * smoothXY;
double newZ = cameraPos.getZ() + (targetPos.getZ() - cameraPos.getZ()) * smoothZ;

cameraPos = new Point3D(newX, newY, newZ);

transform.setPosition3D(cameraPos);
transform.lookAt(entity.getPosition3D());
transform.setY(cameraPos.getY() + CAMERA_HEIGHT_OFFSET);

Cela crée des effets cinématographiques fluides et des contrôles interactifs réactifs.

Matériaux Phong et Texturation

PhongMaterial prend en charge les cartes de textures pour un rendu réaliste :

Google AdInline article slot
  • diffuseMap : Texture de base et couleur de surface.
  • normalMap : Simule des reliefs de surface sans géométrie supplémentaire, économisant des ressources.
  • specularMap : Contrôle les reflets et l'éclat de la surface.
  • specularPower : Ajuste le brillant, du mat au miroir.

Vous pouvez générer automatiquement des normalMap à partir de diffuseMap pour une texturation rapide.

Import de Modèles et Shaders

Les formats supportés incluent .obj et .3ds, en préservant les hiérarchies et transformations. Les imports génèrent des nœuds JavaFX prêts à l'emploi (MeshView, Group).

Intégrez des shaders GLSL via les API de bas niveau :

Google AdInline article slot
  • Shaders de sommets et de fragments pour un rendu personnalisé.
  • Remplacez l'éclairage Phong standard par des effets néon, stylisés ou procéduraux.
  • Gérez textures et attributs de sommets dans les shaders.

ShaderProgram étend le pipeline par défaut.

Limites de JavaFX 3D

Pas d'Ombres

Les objets ne projettent pas d'ombres. Simulez-les avec des polygones manuels. Le shadow mapping dynamique n'est pas disponible sans appels OpenGL directs.

Éclairage Limité

Seuls PointLight, DirectionalLight et AmbientLight sont supportés — pas de Spotlights. L'éclairage par sommet cause des artefacts sur les modèles low-poly. Les contrôles d'intensité et de décroissance manquent de flexibilité.

Pas de Moteur Physique Intégré

Pas de détection de collision, gravité ou inertie. Implémentez manuellement ou utilisez des bibliothèques externes.

Construction de Scène en Code Seulement

Pas d'éditeur WYSIWYG. Les scènes s'assemblent via Group, SubScene et MeshView en code Java.

Intégration avec RepeatCore pour la Modélisation de Systèmes

Pour des applications multiplateformes avec modèles mathématiques, intégrez RepeatCore :

RepeatCore.parseClassMap();
RepeatCore.runtimeAsService = true;
RepeatCore.isSingle = true;
RepeatCoreService.runtimeAsService = true;
RepeatCoreServiceDocument.verboseLevel = 0;
RepeatCoreServiceDocument.startWithoutBinFile = true;
var repeatCoreService = new RepeatCoreService();
var tempdoc = new RepeatCoreServiceDocument();
serviceDocument = tempdoc.openDocument(filename);
serviceDocument.setParentRepeatCoreService(repeatCoreService);
serviceDocument.documentCalculate();

Récupérez les objets par ID :

speed_setpoint = (Constant) getObjbyIdFromList(serviceDocument.componentList, "1739110251130");

Mettez à jour les données via bindings ou streams pour synchroniser avec le rendu 3D FXGL. Cela permet des applications de contrôle d'entraînements électriques avec visualisation en temps réel.

Exemple : Démo de contrôle d'entraînement électrique avec graphiques et scènes 3D.

Implémentation Pratique avec FXGL

Porter des assets de jeux classiques (comme NFS) vers FXGL implique d'ajuster échelle, éclairage et modèles. Corriger les problèmes d'échelle et importer les textures démontre sa puissance de prototypage.

Ajouter une interface pour les réglages lumineux et hiérarchies d'objets simplifie le débogage.

Points Clés :

  • FXGL + JavaFX 3D excelle pour les prototypes et simulateurs gamifiés, pas pour les jeux de production.
  • PhongMaterial avec normalMap offre des visuels solides sans compter élevé de polygones.
  • Intégration RepeatCore embarque la modélisation de systèmes dans les apps 3D.
  • Limites principales : pas d'ombres, physique ou éditeur visuel.
  • Shaders GLSL débloquent des effets de rendu personnalisés.

— Editorial Team

Advertisement 728x90

Lire ensuite