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ę:
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:
- 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:
- 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
Brak komentarzy.