JavaFX testo 2D con sfondo in scena 3D
Per il mio progetto, ho bisogno di testo 2D all'interno di una scena 3D (non come overlay!). Quindi ho provato ad aggiungere un BorderPane
con Label
/Text
nodi alla mia scena:
Il problema è però che lo sfondo bianco del pannello è a volte sovrapposto con l'etichetta (hanno la stessa profondità a quanto pare) quando zoom in, out o volare in giro con la mia macchina fotografica.
C'è un modo per "elevare" l'etichetta dal suo pannello? Ho provato a impostare setDepthTest(true);
senza alcun effetto.
Ecco un semplice esempio che mostra il problema. La classe Xform
proviene dal campione di molecole di Oracle (http://docs.oracle.com/javase/8/javafx/graphics-tutorial/sampleapp3d-code.htm#CJAGGIFG):
package mypackage;
import mypackage.Xform;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Example extends Application {
private Stage primaryStage;
private final Group root = new Group();
@Override
public void start(Stage primaryStage) throws Exception {
this.primaryStage = primaryStage;
primaryStage.setTitle("Example");
this.primaryStage.setWidth(500);
this.primaryStage.setHeight(500);
Scene scene = new Scene(this.root, 500, 500, true, SceneAntialiasing.BALANCED);
scene.setFill(Color.WHITESMOKE);
Text text = new Text();
text.setText("This is a text sample");
text.setStyle("-fx-font-size: 20;");
text.setCache(true);
BorderPane borderPane = new BorderPane();
borderPane.setStyle("-fx-border-color: black;-fx-background-color: #66CCFF;");
borderPane.setTop(text);
this.root.getChildren().add(borderPane);
PerspectiveCamera camera = new PerspectiveCamera(true);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setTranslateX(100);
camera.setTranslateZ(-500);
Xform cameraXform = new Xform();
Xform cameraXform2 = new Xform();
Xform cameraXform3 = new Xform();
cameraXform.getChildren().add(cameraXform2);
cameraXform2.getChildren().add(cameraXform3);
cameraXform3.getChildren().add(camera);
//cameraXform3.setRotateZ(180.0);
cameraXform.ry.setAngle(400.0); // 320
cameraXform.rx.setAngle(20.0); // 40
scene.setCamera(camera);
this.primaryStage.setScene(scene);
this.primaryStage.show();
}
public static void main(String[] args) {
System.setProperty("prism.lcdtext", "false");
System.setProperty("prism.text", "t2k");
launch(args);
}
}
1 answers
Poiché si sta incorporando il nodo Text
in un riquadro di bordo in stile e si esegue il rendering di entrambi nella scena, l'impostazione anche della cache per il riquadro di bordo aiuta davvero.
borderPane.setCache(true);
Andrai da questo:
A questo:
Inoltre, è possibile impostare questo suggerimento, per migliorare la risoluzione.
borderPane.setCacheHint(CacheHint.SCALE_AND_ROTATE);