Source de lumière visible dans JavaFX 3D


J'étudie actuellement les capacités JavaFX 3D, et je voudrais modéliser le système solaire. J'ai assez réussi à créer une source de lumière de type PointLight, et à définir ses coordonnées liées aux coordonnées du soleil. Maintenant, je voudrais voir le soleil brille avec son éclat comme source de lumière. Comment dois-je procéder?

@Component
public class RootPane extends StackPane {

    @Inject
    protected Scene scene;

    @Inject
    protected PerspectiveCamera camera;

    @Inject
    protected LightBase lightBase;

    @PostConstruct
    public void init() {
        setBackground(new Background(new BackgroundFill(
                Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
        setAlignment(Pos.CENTER);
        setPadding(new Insets(20));

        Sphere sunSphere = new Sphere(80);
        sunSphere.setEffect(new Glow(5));

        Sphere mercurySphere = new Sphere(40);
        mercurySphere.translateZProperty().bind(sunSphere.translateZProperty()
                .add(200));

        Sphere venusSphere = new Sphere(40);
        venusSphere.translateXProperty().bind(sunSphere.translateXProperty()
                .subtract(300));
        venusSphere.translateZProperty().bind(sunSphere.translateZProperty()
                .subtract(300));

        Sphere earthSphere = new Sphere(40);
        earthSphere.translateXProperty().bind(sunSphere.translateXProperty()
                .add(300));
        earthSphere.translateZProperty().bind(sunSphere.translateZProperty()
                .subtract(400));

        Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
        Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
        Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);

        Translate translate = new Translate(0, 0, -3000);

        camera.getTransforms().addAll(rotateX, rotateY, rotateZ, translate);

        scene.addEventHandler(
                KeyEvent.KEY_PRESSED,
                event -> {
                    if (Objects.equals(event.getCode(), KeyCode.D)) {
                        rotateY.setAngle(rotateY.getAngle() - 
                                (event.isShiftDown() ? 5 : 0.1));
                    } else if (Objects.equals(event.getCode(), KeyCode.A)) {
                        rotateY.setAngle(rotateY.getAngle() + 
                                (event.isShiftDown() ? 5 : 0.1));
                    }
                });
        scene.addEventHandler(
                KeyEvent.KEY_PRESSED,
                event -> {
                    if (Objects.equals(event.getCode(), KeyCode.W)) {
                        rotateX.setAngle(rotateX.getAngle() - 
                                (event.isShiftDown() ? 5 : 0.1));
                    } else if (Objects.equals(event.getCode(), KeyCode.S)) {
                        rotateX.setAngle(rotateX.getAngle() + 
                                (event.isShiftDown() ? 5 : 0.1));
                    }
                });

        lightBase.translateXProperty().bind(sunSphere.translateXProperty());
        lightBase.translateYProperty().bind(sunSphere.translateYProperty());
        lightBase.translateZProperty().bind(sunSphere.translateZProperty());

        getChildren().addAll(sunSphere, mercurySphere, venusSphere,
                earthSphere, camera, lightBase);
    }

}
Author: Warren M. Nocos, 2015-12-26

2 answers

Sans un exemple de l'effet que vous cherchez à atteindre, il est difficile de donner une réponse, mais voici Deux options:

Créer un effet de particules émettant du soleil avec un mélange additif

Créer un matériau avec une carte spéculaire.

 1
Author: jjhavokk, 2016-01-04 17:48:09

À Partir De PhongMaterial JavaDoc

La couleur est calculée par l'équation suivante:

for each ambient light source i {
    ambient += lightColor[i]
}
for each point light source i {
    diffuse += (L[i] . N) * lightColor[i]
    specular += ((R[i] . V) ^ (specularPower * intensity(specularMap))) * lightColor[i]
}
color = (ambient + diffuse) * diffuseColor * diffuseMap
         + specular * specularColor * specularMap
         + selfIlluminationMap

Où:

LightColor[i] est la couleur de la source lumineuse i,

L [i] est le vecteur de la surface à la source lumineuse i,

N est le vecteur normal (en tenant compte du bumpMap si présent),

R[i] est le vecteur de réflexion normalisé pour L [i] à propos de la normale de surface,

Et V est la vue normalisée vecteur.

Si vos coordonnées PointLight correspondent aux coordonnées de la Sphère de votre Soleil, alors L[i]. N

Essayez d'ajouter cette selfIlluminationMap qu'ils ont mentionnée en utilisant sun texture. Il doit aider.

Une brève recherche sur google m'a donné ce lien, peut être utile: planètes et le soleil des cartes. Soyez prudent avec les licences, cependant, il devrait y avoir des sources libres.

 1
Author: IceGlow, 2016-01-12 13:07:00