是否可以在JavaFX中创建类似于Google地图中的photohpere的光球?如果是,怎么办?

最佳答案

答案是肯定的,您可以在JavaFX中创建光球。

至于方法,有一个基于3D API球体的简单解决方案,但我们可以使用自定义网格来实现改进的解决方案。

让我们从使用常规球体开始。我们只需要一个360º的图像,例如one

正如我们希望从球体内部看到的那样,我们必须水平翻转图像,并将其添加到球体材料的扩散贴图中。

然后,我们只需要在球体的正中央安装一个摄像头,添加一些灯光并开始旋转即可。

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



现在,您要向摄像机添加一些控件(以便进行导航)。您会发现该解决方案在球体的顶部和底部都有一个薄弱点,这是因为图像的所有顶部或底部都位于一个点上:

您可以在F(X)yz库here中找到此问题的解决方案。名为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,它基于一个多维数据集和每个面上的一个正方形图像。还要检查高级相机选项。

最后,请注意,现在在F(X)yz-Sampler application中演示了此和更多3D高级形状。

09-05 10:24