Google マップのフォトスフィアに似たフォトスフィアを JavaFX で作成することは可能ですか? はいの場合、どのように?
1 に答える
答えはイエスです。JavaFX で光球を作成できます。
方法については、3D API の球に基づく簡単なソリューションがありますが、カスタム メッシュを使用して改善されたソリューションを実装できます。
通常の球体を使用することから始めましょう。このような 360 度の画像が必要です。
球の内側から見たいので、画像を水平方向に反転し、球のマテリアルの拡散マップに追加する必要があります。
次に、球の中心にカメラをセットアップし、いくつかのライトを追加して、回転を開始するだけです。
@Override
public void start(Stage primaryStage) {
PerspectiveCamera camera = new PerspectiveCamera(true);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setFieldOfView(90);
Sphere sphere = new Sphere(1000);
sphere.setCullFace(CullFace.NONE);
PhongMaterial material = new PhongMaterial();
/*
"SonyCenter 360panorama" by François Reincke - Own work. Made using autostitch (www.autostitch.net)..
Licensed under CC BY-SA 3.0 via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:SonyCenter_360panorama.jpg#mediaviewer/File:SonyCenter_360panorama.jpg
*/
material.setDiffuseMap(new Image(getClass().getResource("SonyCenter_360panorama_reversed.jpg").toExternalForm()));
sphere.setMaterial(material);
Group root3D = new Group(camera,sphere,new AmbientLight(Color.WHITE));
Scene scene = new Scene(root3D, 800, 600, true, SceneAntialiasing.BALANCED);
scene.setCamera(camera);
primaryStage.setTitle("PhotoSphere in JavaFX3D");
primaryStage.setScene(scene);
primaryStage.show();
final Timeline rotateTimeline = new Timeline();
rotateTimeline.setCycleCount(Timeline.INDEFINITE);
camera.setRotationAxis(Rotate.Y_AXIS);
final KeyValue kv1 = new KeyValue(camera.rotateProperty(), 360);
final KeyFrame kf1 = new KeyFrame(Duration.millis(30000), kv1);
rotateTimeline.getKeyFrames().addAll(kf1);
rotateTimeline.play();
}
次に、カメラにいくつかのコントロールを追加します (ナビゲートできるようにするため)。画像の上部または下部がすべて 1 点にあるため、このソリューションには球体の上部と下部に弱点があることがわかります。
この問題の解決策は、こちらの F(X)yz ライブラリにあります。と呼ばれるカスタム メッシュをSegmentedSphereMesh
使用すると、球の極端な部分を切り取ることができるため、画像は引き伸ばされることなく縦横比を維持できます。
リポジトリを複製してビルドする場合は、FXyz.jar をプロジェクトに追加Sphere
し、前のスニペットを次のように置き換えます。
SegmentedSphereMesh sphere = new SegmentedSphereMesh(100,0,26,1000);
sphere.setCullFace(CullFace.NONE);
sphere.setTextureModeImage(getClass().getResource("SonyCenter_360panorama_reversed.jpg").toExternalForm());
SkyBox
同じライブラリで、立方体とその各面にある 1 つの正方形の画像に基づいた を見つけることができます。高度なカメラ オプションも確認してください。
最後に、F(X)yz-Samplerアプリケーションで、これとさらに高度な 3D 形状が示されていることに注意してください。