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);
}
}
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.
À 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.