将标志设置为true渲染,将摄像机设置为子场景,然后 然后旋转:
在SubScene中呈现的木琴:
在场景中渲染的木琴:
使用Oracle的Xylophone 3D示例,我遇到了一个奇怪的问题。 (Xylophone.java) 在Scene中渲染时,它看起来是正确的。当它在SubScene中渲染时,它不会。有没有人遇到过这个?有解决方案或解决方法吗?
以下是创建SubScene的修改代码:
final SubScene sub = new SubScene(camOffset, 800,600, false, SceneAntialiasing.BALANCED);
AnchorPane pane = new AnchorPane();
pane.setDepthTest(DepthTest.ENABLE);
pane.getChildren().add(sub);
final Scene scene = new Scene(pane, 800, 600, true);
答案 0 :(得分:2)
尝试在SubScene-Constructor中将depthBuffer-flag(第4个参数)设置为true: final SubScene sub = new SubScene(camOffset,800,600,true,SceneAntialiasing.BALANCED); 在3d场景中,深度排序渲染需要depthBuffer(参见例如https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Scene.html)。 此外(如果尚未完成)摄像机应分配给subScene而不是场景: sub.setCamera(new PerspectiveCamera()); 然后一切都应该按预期工作。
编辑:
此外,对子场填充应用渐变似乎不起作用,请参阅
https://bugs.openjdk.java.net/browse/JDK-8088605
https://www.youtube.com/watch?v=LGx4CV_K5U8&feature=youtu.be
可能的解决方法是将渐变应用于包含子场景的窗格。
总的来说,在Xylophone-class的start-method中替换
final Scene scene = new Scene(camOffset, 800, 600, true);
scene.setFill(new RadialGradient(225, 0.85, 300, 300, 500, false,
CycleMethod.NO_CYCLE, new Stop[]
{ new Stop(0f, Color.BLUE),
new Stop(1f, Color.LIGHTBLUE) }));
scene.setCamera(new PerspectiveCamera());
与
final SubScene sub = new SubScene(camOffset, 800,600, true, SceneAntialiasing.BALANCED); // set depthBuffer = true
sub.setCamera(new PerspectiveCamera());
AnchorPane pane = new AnchorPane();
pane.setDepthTest(DepthTest.ENABLE);
pane.getChildren().add(sub);
final Scene scene = new Scene(pane, 800, 600, true);
// Shift the RadialGradient from the Scene to the AnchorPane (and NOT to the SubScene).
RadialGradient radialGradient = new RadialGradient(225, 0.85, 300, 300, 500, false,
CycleMethod.NO_CYCLE, new Stop[]
{ new Stop(0f, Color.BLUE),
new Stop(1f, Color.LIGHTBLUE) });
pane.setBackground(new Background(new BackgroundFill(radialGradient, CornerRadii.EMPTY, Insets.EMPTY)));
此代码适用于我的机器。