是否可以在JavaFX中创建与Google地图中的photosphere类似的光球?如果是,怎么样?
答案 0 :(得分:5)
答案是肯定的,你可以在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
的自定义网格允许您裁剪球体的极值,因此图像可以保持其纵横比而不会被拉伸。
如果您克隆并构建了repo,请将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高级形状。