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:
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);
}
}
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:
À ceci:
Vous pouvez également définir cet indice pour améliorer la résolution.
borderPane.setCacheHint(CacheHint.SCALE_AND_ROTATE);