Zurück zur Startseite

FXGL 3D-Rendering: Kamera und JavaFX-Shaders

Der Artikel analysiert die Nutzung von FXGL und JavaFX 3D für Prototypen mit Systemmodellierung. Beschreibt Kamerasteuerung, PhongMaterial-Materialien, Modellimport, GLSL-Shaders und RepeatCore-Integration. Wichtige Einschränkungen werden hervorgehoben: Fehlen von Schatten und Physik.

3D in FXGL: von Kamera bis Systemmodellierung
Advertisement 728x90

3D-Rendering in FXGL und JavaFX: Features, Grenzen und Integration mit RepeatCore

Die JavaFX-3D-Kamera bietet volle Kontrolle über die Ansichtsparameter. Durch Anpassung des Sichtfelds (FOV) können Sie den Blickwinkel dynamisch ändern, z. B. mit Bindings:

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

Die Einstellung der Nah- und Fern-Clipping-Ebenen optimiert das Rendering, indem unsichtbare Objekte ausgeblendet werden. Translationen und Rotationen steuern die Kamerabewegung und -drehung.

Um die Kamera an ein Objekt wie ein Auto zu binden, berechnen Sie die Position so:

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);

Für flüssige Bewegungen nutzen Sie Interpolation mit Easing-Faktoren:

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);

Das erzeugt weiche kinematische Effekte und reaktive Steuerungen.

Phong-Materialien und Texturen

PhongMaterial unterstützt Textur-Maps für realistisches Rendering:

Google AdInline article slot
  • diffuseMap: Basis-Textur und Oberflächenfarbe.
  • normalMap: Simuliert Oberflächenunebenheiten ohne zusätzliche Geometrie – spart Ressourcen.
  • specularMap: Steuert Reflexionen und Glanz.
  • specularPower: Regelt den Glanzgrad von matt bis spiegelnd.

Normal-Maps lassen sich automatisch aus Diffuse-Maps generieren – ideal für schnelles Texturing.

Modellimport und Shaders

Unterstützte Formate: .obj und .3ds, inklusive Hierarchien und Transformationen. Imports erzeugen direkt nutzbare JavaFX-Knoten (MeshView, Group).

Integrieren Sie GLSL-Shader über Low-Level-APIs:

Google AdInline article slot
  • Vertex- und Fragment-Shader für individuelles Rendering.
  • Ersetzen Sie Standard-Phong-Beleuchtung durch Neon-, Stylized- oder prozedurale Effekte.
  • Verwalten Sie Texturen und Vertex-Attribute in Shaders.

ShaderProgram-Hooks erweitern die Standard-Pipeline.

Grenzen von JavaFX 3D

Keine Schatten

Objekte werfen keine Schatten. Simulieren Sie sie mit manuellen Polygonen. Dynamisches Shadow Mapping fehlt ohne direkte OpenGL-Zugriffe.

Begrenzte Beleuchtung

Nur PointLight, DirectionalLight und AmbientLight – keine Spotlights. Per-Vertex-Beleuchtung erzeugt Artefakte bei Low-Poly-Modellen. Intensität und Abfallkurven sind unflexibel.

Kein integrierter Physik-Engine

Keine Kollisionserkennung, Gravitation oder Trägheit. Manuelle Umsetzung oder externe Bibliotheken notwendig.

Nur Code-basierter Szenenaufbau

Kein WYSIWYG-Editor. Szenen werden per Group, SubScene und MeshView im Java-Code zusammengesetzt.

Integration mit RepeatCore für Systemmodellierung

Für plattformübergreifende Apps mit mathematischen Modellen integrieren Sie 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();

Objekte per ID abrufen:

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

Daten über Bindings oder Streams aktualisieren, um mit FXGL-3D-Rendering zu synchronisieren. So entstehen Apps zur Steuerung von Elektroantrieben mit Echtzeit-Visualisierung.

Beispiel: Demo zur Elektroantriebssteuerung mit Diagrammen und 3D-Szenen.

Praktische Umsetzung in FXGL

Assets aus Klassikern (z. B. NFS) nach FXGL portieren: Skalierung, Beleuchtung und Modelle anpassen. Skalierungsprobleme beheben und Texturen importieren – zeigt die Prototyping-Stärke.

UI für Lichteinstellungen und Objekthierarchien erleichtert Debugging.

Wichtige Erkenntnisse:

  • FXGL + JavaFX 3D eignet sich hervorragend für Prototypen und gamifizierte Simulatoren, nicht für Produktionsspiele.
  • PhongMaterial mit Normal-Maps liefert starke Optik ohne High-Poly-Modelle.
  • RepeatCore-Integration bringt Systemmodellierung in 3D-Apps.
  • Hauptschwächen: Keine Schatten, Physik oder visueller Editor.
  • GLSL-Shader ermöglichen maßgeschneiderte Render-Effekte.

— Editorial Team

Advertisement 728x90

Weiterlesen