JavaFX Texte 2D avec arrière-plan dans la scène 3D


Pour mon projet, j'ai besoin de texte 2D dans une scène 3D (pas comme superposition!). J'ai donc essayé d'ajouter un BorderPane avec Label/Text les nœuds de ma scène:

entrez la description de l'image ici

Le problème est cependant que le fond blanc du panneau se chevauche parfois avec l'étiquette (ils ont apparemment la même profondeur) lorsque je zoome, dézoomer ou survole avec mon appareil photo.

Existe-t-il un moyen d ' "élever" l'étiquette de son panneau? J'ai essayé de définir setDepthTest(true); sans effet.

Voici un simple exemple montrant le problème. La classe Xform provient de l'échantillon de molécule d'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

Étant donné que vous intégrez le nœud Text dans un panneau de bordure de style et que vous restituez les deux dans la scène, la définition du cache pour le panneau de bordure est également très utile.

borderPane.setCache(true);

Vous partirez de ceci:

Texte du Cache

À ceci:

Panneau de bordure de cache

Vous pouvez également définir cet indice pour améliorer la résolution.

borderPane.setCacheHint(CacheHint.SCALE_AND_ROTATE);

cache soupçon

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