Powrót do strony głównej

FXGL renderowanie 3D: kamera i shadery JavaFX

Artykuł analizuje wykorzystanie FXGL i JavaFX 3D do prototypów z modelowaniem systemowym. Opisano zarządzanie kamerą, materiały PhongMaterial, import modeli, GLSL-shadery i integrację RepeatCore. Wyodrębniono kluczowe ograniczenia: brak cieni i fizyki.

3D w FXGL: od kamery do modelowania systemowego
Advertisement 728x90

Renderowanie 3D w FXGL i JavaFX: możliwości, ograniczenia i integracja z modelowaniem systemowym

Kamera w JavaFX 3D daje pełną kontrolę nad parametrami widoku. Dostosowanie pola widzenia (FOV) pozwala dynamicznie zmieniać kąt widzenia za pomocą bindingów:

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

Regulacja płaszczyzn bliskiej i dalekiej obcinania optymalizuje renderowanie, eliminując niewidoczne obiekty. Transformacje Translate i Rotate umożliwiają przesuwanie i obracanie kamery.

Aby przyczepić kamerę do obiektu, np. samochodu, oblicza się pozycję:

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

Płynne ruchy realizuje się przez interpolację z współczynnikami:

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

Dzięki temu można tworzyć płynne efekty kinowe i interaktywne sterowanie.

Materiały PhongMaterial i teksturowanie

PhongMaterial obsługuje mapy dla realistycznego renderowania:

Google AdInline article slot
  • diffuseMap: podstawowa tekstura i kolor powierzchni.
  • normalMap: symulacja reliefu bez dodatkowej geometrii, oszczędza zasoby.
  • specularMap: kontrola odbić na powierzchniach.
  • specularPower: ustawienie stopnia połysku od matowego do lustrzanego.

Mapę normalną można generować automatycznie z diffuseMap dla szybkiego teksturowania.

Import modeli i shadery

Obsługiwane formaty .obj, .3ds z zachowaniem hierarchii i transformacji. Import tworzy gotowe węzły JavaFX (MeshView, Group).

Integracja shaderów GLSL przez niskopoziomowe API:

Google AdInline article slot
  • Shadery wierzchołkowe i fragmentowe dla niestandardowego renderowania.
  • Zamiana standardowego oświetlenia Phong na neonowe, stylizowane lub proceduralne efekty.
  • Zarządzanie teksturami i atrybutami wierzchołków w shaderach.

Podłączenie przez ShaderProgram rozszerza standardowy pipeline.

Ograniczenia JavaFX 3D

Brak cieni

Obiekty nie rzucają cieni. Do imitacji trzeba ręcznie tworzyć poligony. Dynamiczne mapowanie cieni niedostępne bez wywołań OpenGL.

Ograniczona obsługa oświetlenia

Dostępne PointLight, DirectionalLight, AmbientLight. Brak Spotlight. Oświetlenie per-wierzchołek powoduje artefakty na modelach niskopolygonalnych. Ustawienia intensywności i zaniku są mało elastyczne.

Brak silnika fizyki

Brak detekcji kolizji, grawitacji, inercji. Implementacja wymaga ręcznego kodu lub zewnętrznych bibliotek.

Tylko budowa scen w kodzie

Brak edytora WYSIWYG. Sceny buduje się przez Group, SubScene, MeshView w kodzie Java.

Integracja z RepeatCore dla modelowania systemowego

Dla aplikacji wieloplatformowych z modelami matematycznymi podłącza się 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();

Pobieranie obiektów po ID:

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

Aktualizacja danych przez bindingi lub strumienie synchronizuje się z renderowaniem 3D w FXGL. Pozwala to tworzyć aplikacje do sterowania napędami elektrycznymi z wizualizacją.

Przykład: demo sterowania napędem z wykresami i sceną 3D.

Praktyczna realizacja w FXGL

Przenoszenie assetów ze starych gier (NFS) do FXGL wymaga iteracji po skali, oświetleniu i modelach. Rozwiązanie problemów skali i import tekstur pokazuje praktyczne zastosowanie do prototypów.

Dodanie UI do konfiguracji oświetlenia i drzewa obiektów ułatwia debugowanie.

Co ważne:

  • FXGL + JavaFX 3D nadaje się do prototypów i gamifikowanych symulatorów, nie do gier produkcyjnych.
  • PhongMaterial z normalMap zapewnia akceptowalny wizualnie efekt bez wysokiej poligonalizacji.
  • Integracja RepeatCore pozwala wbudować modelowanie systemowe w aplikacje 3D.
  • Główne ograniczenia: brak cieni, fizyki i edytora wizualnego.
  • Shadery GLSL rozszerzają renderowanie o niestandardowe efekty.

— Editorial Team

Advertisement 728x90

Czytaj dalej