プロジェクト

全般

プロフィール

« | » 

リビジョン 097e9149

高徹 高橋 徹 さんが約9年前に追加

  • ID 097e9149a31ff8233f3e400419e246fb8566fae3
  • e985b1fc

#66 カメラ移動のリファクタリングを実施、緯度のスライダー移動を円軌道の赤道面からの仰角に変更

差分を表示:

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

他の形式にエクスポート: Unified diff