Volver al inicio

Renderizado 3D de FXGL: cámara y shaders de JavaFX

El artículo analiza el uso de FXGL y JavaFX 3D para prototipos con modelado de sistemas. Describe el control de cámara, materiales PhongMaterial, importación de modelos, shaders GLSL e integración de RepeatCore. Se destacan las limitaciones clave: falta de sombras y física.

3D en FXGL: desde la cámara hasta el modelado de sistemas
Advertisement 728x90

## Renderizado 3D en FXGL y JavaFX: Funciones, limitaciones e integración con modelado de sistemas

La cámara 3D de JavaFX te da control total sobre los parámetros de vista. Ajustar el campo de visión (FOV) permite cambiar dinámicamente el ángulo de visión mediante bindings:

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

Ajustar los planos de recorte cercano y lejano optimiza el renderizado eliminando objetos invisibles. Las transformaciones de traslación y rotación manejan el movimiento y giro de la cámara.

Para acoplar la cámara a un objeto como un coche, calcula la posición así:

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

El movimiento suave se logra con interpolación usando factores de 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);

Esto crea efectos cinematográficos suaves y controles interactivos responsivos.

Materiales Phong y texturas

PhongMaterial soporta mapas de texturas para un renderizado realista:

Google AdInline article slot
  • diffuseMap: Textura base y color de superficie.
  • normalMap: Simula relieves superficiales sin geometría extra, ahorrando recursos.
  • specularMap: Controla reflejos y brillo superficial.
  • specularPower: Ajusta el gloss desde mate hasta efecto espejo.

Puedes generar mapas normales automáticamente desde mapas difusos para texturizado rápido.

Importación de modelos y shaders

Formatos compatibles incluyen .obj y .3ds, preservando jerarquías y transformaciones. Las importaciones generan nodos JavaFX listos para usar (MeshView, Group).

Integra shaders GLSL mediante APIs de bajo nivel:

Google AdInline article slot
  • Shaders de vértice y fragmento para renderizado personalizado.
  • Sustituye la iluminación Phong estándar por efectos neón, estilizados o procedurales.
  • Gestiona texturas y atributos de vértice en shaders.

ShaderProgram extiende el pipeline por defecto.

Limitaciones de JavaFX 3D

Sin sombras

Los objetos no proyectan sombras. Simúlalas con polígonos manuales. El mapeo dinámico de sombras no está disponible sin llamadas directas a OpenGL.

Iluminación limitada

Solo se soportan PointLight, DirectionalLight y AmbientLight — sin focos. La iluminación por vértice causa artefactos en modelos de baja poligonización. Los controles de intensidad y atenuación carecen de flexibilidad.

Sin motor de física integrado

No hay detección de colisiones, gravedad ni inercia. Impleméntalo manualmente o usa librerías externas.

Construcción de escenas solo por código

No hay editor WYSIWYG. Las escenas se arman vía Group, SubScene y MeshView en código Java.

Integración con RepeatCore para modelado de sistemas

Para apps multiplataforma con modelos matemáticos, integra 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();

Obtén objetos por ID:

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

Actualiza datos vía bindings o streams para sincronizar con el renderizado 3D de FXGL. Esto habilita apps para controlar accionamientos eléctricos con visualización en tiempo real.

Ejemplo: Demo de control de accionamiento eléctrico con gráficos y escenas 3D.

Implementación práctica en FXGL

Adaptar assets de juegos clásicos (como NFS) a FXGL implica ajustar escala, iluminación y modelos. Corregir problemas de escala e importar texturas demuestra su potencia en prototipado.

Agregar una UI para ajustes de luces y jerarquías de objetos simplifica la depuración.

Lecciones clave:

  • FXGL + JavaFX 3D brilla en prototipos y simuladores gamificados, no en juegos de producción.
  • PhongMaterial con mapas normales ofrece visuales sólidos sin alto conteo de polígonos.
  • La integración con RepeatCore embebe modelado de sistemas en apps 3D.
  • Principales límites: sin sombras, física ni editor visual.
  • Shaders GLSL desbloquean efectos de renderizado personalizados.

— Editorial Team

Advertisement 728x90

Leer después