Zpět na domů

FXGL 3D vykreslování: kamera a shadery JavaFX

Článek rozebírá použití FXGL a JavaFX 3D pro prototypy se systémovým modelováním. Jsou popsány ovládání kamery, materiály PhongMaterial, import modelů, GLSL shadery a integrace RepeatCore. Jsou vyzdvižena klíčová omezení: absence stínů a fyziky.

3D v FXGL: od kamery po systémové modelování
Advertisement 728x90

3D rendering v FXGL a JavaFX: možnosti, limity a integrace s modelováním systémů

Kamera v JavaFX 3D nabízí plnou kontrolu nad parametry pohledu. Nastavení úhlu zorného pole (FOV) umožňuje dynamicky měnit úhel pohledu prostřednictvím vazeb:

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

Úprava blízké a vzdálené střižné roviny optimalizuje rendering tím, že vyloučí neviditelné objekty. Transformace Translate a Rotate zajišťují pohyb a rotaci kamery.

Pro připojení kamery k objektu, např. automobilu, se používá výpočet pozice:

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

Vyhlazení pohybu se realizuje interpolací s koeficienty:

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

Tím lze vytvářet plynulé kinematografické efekty a interaktivní ovládání.

Materiály PhongMaterial a texturování

PhongMaterial podporuje mapy pro realistický rendering:

Google AdInline article slot
  • diffuseMap: základní textura a barva povrchu.
  • normalMap: simulace reliéfu bez dodatečné geometrie, šetří zdroje.
  • specularMap: ovládání odlesků na površích.
  • specularPower: nastavení stupně lesku od matného po zrcadlový.

NormalMap lze generovat automaticky z diffuseMap pro rychlé texturování.

Import modelů a shadery

Podporovány jsou formáty .obj, .3ds s zachováním hierarchie a transformací. Import vytváří připravené uzly JavaFX (MeshView, Group).

Integrace GLSL shaderů přes nízkou úroveň API:

Google AdInline article slot
  • Vertex a fragment shadery pro vlastní rendering.
  • Nahrazení standardního Phong osvětlení neonovým, stylizovaným nebo procedurálními efekty.
  • Řízení textur a atributů vrcholů ve shaderech.

Připojení přes ShaderProgram rozšiřuje standardní pipeline.

Limity JavaFX 3D

Absence stínů

Objekty neodrážejí stíny. Pro imitaci je nutné ruční vytváření polygonů. Dynamické shadow mapping není dostupné bez volání OpenGL.

Omezené osvětlení

Dostupné jsou PointLight, DirectionalLight, AmbientLight. Chybí Spotlight. Per-vertex lighting způsobuje artefakty na modelech s nízkým počtem polygonů. Nastavení intenzity a útlumu není dostatečně flexibilní.

Chybí fyzikální engine

Není detekce kolizí, gravitace ani setrvačnosti. Realizace vyžaduje ruční kód nebo externí knihovny.

Pouze kódová sestava scén

Není WYSIWYG editor. Scény se staví přes Group, SubScene, MeshView v Java kódu.

Integrace s RepeatCore pro modelování systémů

Pro krosplatformové aplikace s matematickými modely se připojuje 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();

Získání objektů podle ID:

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

Aktualizace dat přes vazby nebo streamy se synchronizuje s 3D renderingem v FXGL. To umožňuje vytvářet aplikace pro řízení elektropohonů s vizualizací.

Příklad: demo řízení elektropohonu s grafy a 3D scénou.

Praktická realizace v FXGL

Přenos assetů ze starých her (NFS) do FXGL vyžaduje iterace nad měřítkem, osvětlením a modely. Řešení problémů měřítka a import textur demonstruje praktickou použitelnost pro prototypy.

Přidání UI pro nastavení světla a stromu objektů usnadňuje ladění.

Co je důležité:

  • FXGL + JavaFX 3D je vhodné pro prototypy a gamifikované simulátory, ne pro produkční hry.
  • PhongMaterial s normalMap zajišťuje přijatelný vizuál bez vysoké polygonizace.
  • Integrace RepeatCore umožňuje vestavovat modelování systémů do 3D aplikací.
  • Hlavní limity: chybí stíny, fyzika a vizuální editor.
  • GLSL shadery rozšiřují rendering pro vlastní efekty.

— Editorial Team

Advertisement 728x90

Číst dál