2015-02-26 1 views
2

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 nœuds à ma scène:Texte 2D JavaFX avec arrière-plan dans la scène 3D

enter image description here

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

Existe-t-il un moyen d '«élever» l'étiquette de son panneau? J'ai essayé de régler setDepthTest(true); sans aucun effet.

Voici un exemple simple montrant le problème. La Xform classe est de l'échantillon 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); 
    } 

} 

Répondre

4

Puisque vous intégrez le nœud Text dans un volet de bordure de style, et de rendre à la fois dans la scène, qui fixeraient également le cache pour le volet frontière vraiment aide.

borderPane.setCache(true); 

Vous partirez de ceci:

Cache text

à ceci:

Cache border pane

En outre, vous pouvez définir cette indication, pour améliorer la résolution.

borderPane.setCacheHint(CacheHint.SCALE_AND_ROTATE); 

cache hint

+0

Je me demande si le même pour les boutons ... – jdub1581

+0

@ jdub1581 Oui, il le fait! –

+0

J'ai essayé le code ci-dessus, mais la cellule ne parvient pas à rendre dès que je l'ai décalée. Les décalages X et Y sont corrects: (libellé (BorderPane)) .translateZProperty(). Set (z); // Echec du rendu de la cellule si z! = 0 J'ai essayé de désactiver la mise en cache sur Text et BorderPane mais cela n'a pas aidé à voir la cellule. – Martin