リビジョン 097e9149
| learn/java/javafx/Hello3d/Hello3d.java | ||
|---|---|---|
|
|
||
|
private static final double EARTH_RADIUS = 6378.137 / 2; // WGS84長半径[km]
|
||
|
|
||
|
private final Image earthImage = new Image(getClass().getResourceAsStream("physical-free-world-map-b1.jpg"));
|
||
|
//private final Image earthImage = new Image(getClass().getResourceAsStream("physical-free-world-map-b1.jpg"));
|
||
|
private final Image earthImage = new Image(getClass().getResourceAsStream("bluemarble_cyrindricalEqualArea_2048.png"));
|
||
|
private double azimuth;
|
||
|
private long previousHandledTime;
|
||
|
|
||
| ... | ... | |
|
|
||
|
/**
|
||
|
* カメラ位置を更新する。
|
||
|
* カメラは Y=0 の平面(X-Z平面)で原点を中心に (地球半径 + 高度)を半径とした
|
||
|
* 円軌道を移動する。
|
||
|
* また、カメラの角度は常に球体を向くように円軌道の移動に合わせて設定する。
|
||
|
* カメラは原点を中心に (地球半径 + 高度)を半径とし、赤道面(y=0)から
|
||
|
* 指定した仰角の円軌道を移動する。
|
||
|
*/
|
||
|
private void update(long now) {
|
||
|
if (previousHandledTime == 0) {
|
||
| ... | ... | |
|
previousHandledTime = now;
|
||
|
double orbitalRadius = orbitalAltitudeProperty.get() + EARTH_RADIUS;
|
||
|
|
||
|
cameraTranslate.setX(Math.sin(Math.toRadians(azimuth)) * orbitalRadius);
|
||
|
cameraTranslate.setZ(-1 * Math.cos(Math.toRadians(azimuth)) * orbitalRadius);
|
||
|
cameraTranslate.setY(-1 * Math.sin(Math.toRadians(elevationProperty.getValue())) * orbitalRadius);
|
||
|
cameraTranslate.setZ(-orbitalRadius);
|
||
|
cameraRotateX.setAngle(elevationProperty.get());
|
||
|
cameraRotateY.setAngle(-1 * azimuth);
|
||
|
}
|
||
|
|
||
| ... | ... | |
|
camera.setFieldOfView(45d);
|
||
|
camera.setFarClip(100_000d);
|
||
|
camera.getTransforms().addAll(
|
||
|
cameraTranslate,
|
||
|
cameraRotateX,
|
||
|
cameraRotateY,
|
||
|
cameraRotateZ
|
||
|
cameraRotateZ,
|
||
|
cameraTranslate
|
||
|
);
|
||
|
|
||
|
// 点光源の定義
|
||
| ... | ... | |
|
grid.add(azimuthRateLabel, 0, 0);
|
||
|
grid.setValignment(azimuthRateLabel, VPos.TOP);
|
||
|
grid.add(createSlider(-30d, 30d, 1d, 10d, 2d, azimuthRateProperty), 1, 0);
|
||
|
final Label elevationLabel = createSliderLabel("緯度[deg]");
|
||
|
final Label elevationLabel = createSliderLabel("仰角[deg]");
|
||
|
grid.add(elevationLabel, 0, 1);
|
||
|
grid.setValignment(elevationLabel, VPos.TOP);
|
||
|
grid.add(createSlider(-45d, 45d, 0d, 15d, 3d, elevationProperty), 1, 1);
|
||
|
grid.add(createSlider(-90d, 90d, 0d, 30d, 6d, elevationProperty), 1, 1);
|
||
|
final Label altitudeLabel = createSliderLabel("高度[km]");
|
||
|
grid.add(altitudeLabel, 0, 2);
|
||
|
grid.setValignment(altitudeLabel, VPos.TOP);
|
||
| ... | ... | |
|
public static void main(final String... args) {
|
||
|
launch(args);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
#66 カメラ移動のリファクタリングを実施、緯度のスライダー移動を円軌道の赤道面からの仰角に変更