2015-07-21 3 views
1

J'ai le code de test suivant, où j'essaie de découper un MeshView avec un cercle. J'ai aussi essayé de placer le meshView dans un groupe puis de l'écrêter, mais ce résultat est un cercle noir.écrêtage de MeshView scalafx/javafx

Existe-t-il un moyen de découper un MeshView, de préférence sans le mettre dans un groupe?

import scalafx.application.JFXApp 
import scalafx.application.JFXApp.PrimaryStage 
import scalafx.scene.image.Image 
import scalafx.scene.paint.{Color, PhongMaterial} 
import scalafx.scene.shape.{TriangleMesh, Circle, MeshView} 
import scalafx.scene.{Group, PerspectiveCamera, Scene, SceneAntialiasing} 

object Test4 extends JFXApp { 
    stage = new PrimaryStage { 
    scene = new Scene(500, 500, true, SceneAntialiasing.Balanced) { 
     fill = Color.LightGray 
     val clipCircle = Circle(150.0) 
     val meshView = new MeshView(new RectangleMesh(500,500)) { 
     // takes a while to load 
     material = new PhongMaterial(Color.White, new Image("https://peach.blender.org/wp-content/uploads/bbb-splash.png"), null, null, null) 
     } 
    // val meshGroup = new Group(meshView) 
     meshView.setClip(clipCircle) 
     root = new Group {children = meshView; translateX = 250.0; translateY = 250.0; translateZ = 560.0} 
     camera = new PerspectiveCamera(false) 
    } 
    } 
} 

class RectangleMesh(Width: Float, Height: Float) extends TriangleMesh { 
    points = Array(
    -Width/2, Height/2, 0, 
    -Width/2, -Height/2, 0, 
    Width/2, Height/2, 0, 
    Width/2, -Height/2, 0 
) 
    texCoords = Array(
    1, 1, 
    1, 0, 
    0, 1, 
    0, 0 
) 
    faces = Array(
    2, 2, 1, 1, 0, 0, 
    2, 2, 3, 3, 1, 1 
) 

Répondre

0

Le clippling fonctionne réellement bien sur le MeshView enroulé autour d'un Group.

Si vous cochez JavaDoc pour setClip():

Il y a une limitation connue du mélange avec un clip de transformation 3D. L'écrêtage est essentiellement une opération d'image 2D. Le résultat d'un ensemble de clips sur un nœud de groupe avec des enfants transformés en 3D fera que ses enfants seront rendus dans l'ordre sans que le tampon Z ne soit appliqué entre ces enfants.

En raison de ceci:

Group meshGroup = new Group(meshView); 
meshGroup.setClip(clipCircle); 

vous aurez une image 2D, et il semble Material n'est pas appliquée. Cependant, vous pouvez vérifier il y a un maillage, par Seting ceci:

meshView.setDrawMode(DrawMode.LINE); 

Donc, dans votre cas, les dimensions de réglage:

@Override 
public void start(Stage primaryStage) { 
    Circle clipCircle = new Circle(220.0); 
    MeshView meshView = new MeshView(new RectangleMesh(400,400)); 
    meshView.setDrawMode(DrawMode.LINE); 
    Group meshGroup = new Group(meshView); 
    meshGroup.setClip(clipCircle); 
    PerspectiveCamera camera = new PerspectiveCamera(false); 

    StackPane root = new StackPane(); 
    final Circle circle = new Circle(220.0); 
    circle.setFill(Color.TRANSPARENT); 
    circle.setStroke(Color.RED); 
    root.getChildren().addAll(meshGroup, circle); 

    Scene scene = new Scene(root, 500, 500, true, SceneAntialiasing.BALANCED); 
    scene.setCamera(camera); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

donnera ceci:

clip

En fin de compte , l'écrêtage n'a aucun sens avec les formes 3D. Pour cela, vous pouvez utiliser uniquement la forme 2D pour obtenir le résultat souhaité.

Si vous voulez 3D clipping regardez les opérations CSG. Cochez cette case question pour une solution basée sur JavaFX.

+0

Je vais jeter un coup d'œil aux opérations CSG. Si je comprends bien votre réponse, vous dites que cela ne peut pas être fait. – workingdog

+0

L'écrêtage 3D sera une opération booléenne CSG, donc cela peut être fait ... Je n'ai pas dit qu'il ne pouvait pas. Dans la question que je mentionne, vous avez un exemple d'opérations booléennes entre des formes 3D, en utilisant [JCSG] (https://github.com/miho/JCSG) et [FXyz] (https://github.com/Birdasaur/FXyz) bibliothèques. –

+0

Je regarde toujours les opérations booléennes CSG, j'utilisais déjà FXyz et je ne connaissais pas CSG. Les deux bibliothèques sont géniales. Depuis clip() sur un maillage ne fonctionne pas sans détruire le matériel, je suis venu avec une solution de contournement pour faire un écrêtage en utilisant Shape.subtract. Cela fonctionne presque mais il y a un problème. Comment obtenir les points de limite externes d'un maillage en séquence. Je ne comprends pas le séquençage générique des points dans un maillage complexe comme le tissu, et ne peut donc pas élaborer une formule pour choisir seulement les points dont j'ai besoin pour créer un polygone. https://gist.github.com/anonymous/49977e526a501905d1fb – workingdog