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:

inserisci qui la descrizione dell'immagine

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

}
Author: Terran, 2015-02-27

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:

Testo della cache

A questo:

Riquadro bordo cache

Inoltre, è possibile impostare questo suggerimento, per migliorare la risoluzione.

borderPane.setCacheHint(CacheHint.SCALE_AND_ROTATE);

suggerimento cache

 6
Author: José Pereda, 2015-02-27 10:03:28