我目前正在學習JavaFX 3D功能,並且我想模擬太陽系。我很成功地創建了類型PointLight
的光源,並將其座標綁定到太陽座標。現在我想看看太陽作爲光源發出光芒。我會怎麼做?JavaFX中的可見光源3D
@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);
}
}
這是您的完整碼?你可以包括你正在初始化場景,相機,燈箱等場合。 – Amber
你看不到點光源。這是一個點,它有0個區域。你看到太陽,因爲它面積約爲2.35×10^12平方英里,其中一半正在散發你的路。你需要使用同樣的方法模擬外觀,也許增加一些效果,如光環,眩光等。 – IceGlow
哦,我看到你有一個sunSphere。也許你的意思是'上帝之光'效應? – IceGlow