2016-05-20 6 views
0

Ich habe ein paar 3D-geometrische Objekte wie Kugel, Tube, Cube etc. Ich erzeuge mit üblichen Klassen wie Sphere, Cylinder, Box etc innerhalb FXML-based-Menü in einem FXMLcontroller. Dies bedeutet, Objekt box1 ist lokal @FXMLmakeCube Art der Methode.Kann ich 3D-Geometrieobjekte in einer JavaFXCollection platzieren?

Jetzt möchte ich einige Operationen wie boolesche Operation, Kopieren, Spiegeln usw. in einer anderen Methode innerhalb dieses Controllers durchführen. Ich möchte alle erstellten Geometrien in der JavaFXCollection-Sortierung der Liste behalten, damit ich das Handle für diese Geometrien von jeder anderen Methode aus aufrufen kann.

Meine Frage ist, wie kann ich das tun? Wie kann ich diese Griffe in einer anderen Methode innerhalb desselben FXMLController beziehen?

Ich habe keine genaue Frage im Netz gefunden.

+0

Es tut mir leid, ich kann Ihnen nicht folgen. Können Sie bitte, bitte, illustrieren? Willst du sagen, dass ich den kompletten Befehl in einem 'TextField' speichern und dann wiederherstellen muss? Ich dachte anders. Wenn ich 'Box box1 = new Box (...)' verwende, dann kann ich 'box1' als Handle in einer Liste speichern und wenn ich von dieser Liste aus aufrufen kann, wäre es gut. Der Punkt ist, dass ich viele Felder erzeugen kann, indem ich auf Box-Menü klicke, was bedeutet, dass ich sie nicht global definieren kann. – vegaonline

Antwort

1

Sie können alle diese 3D-Objekte in einer Sammlung platzieren, da sie alle von Shape3D reichen.

Sie können eine ObservableList<Shape3D> Sammlung erstellen und jedes Objekt hinzufügen, wenn Sie sie erstellen. Dann können Sie Änderungen in der Sammlung anhören und alle neuen Objekte zur Szene/Subszene hinzufügen.

Dies wäre ein Beispiel für einen Controller mit vier Tasten, wo Sie zufällige Box oder Sphere 3D-Objekte erstellen, sie zur Sammlung hinzufügen und in einer Subszene platzieren können.

Sie können auch Operationen mit der gesamten Sammlung durchführen (in diesem Fall übersetzen oder drehen).

public class FXMLDocumentController { 

    @FXML 
    private Pane pane; 

    private Group pane3D; 
    private PerspectiveCamera camera; 
    private ObservableList<Shape3D> items; 

    @FXML 
    void createBox(ActionEvent event) { 
     Box box = new Box(new Random().nextInt(200), new Random().nextInt(200), new Random().nextInt(200)); 
     box.setMaterial(new PhongMaterial(new Color(new Random().nextDouble(), 
       new Random().nextDouble(), new Random().nextDouble(), new Random().nextDouble()))); 
     box.setTranslateX(-100 + new Random().nextInt(200)); 
     box.setTranslateY(-100 + new Random().nextInt(200)); 
     box.setTranslateZ(new Random().nextInt(200)); 
     items.add(box); 
    } 

    @FXML 
    void createSphere(ActionEvent event) { 
     Sphere sphere = new Sphere(new Random().nextInt(100)); 
     sphere.setMaterial(new PhongMaterial(new Color(new Random().nextDouble(), 
       new Random().nextDouble(), new Random().nextDouble(), new Random().nextDouble()))); 
     sphere.setTranslateX(-100 + new Random().nextInt(200)); 
     sphere.setTranslateY(-100 + new Random().nextInt(200)); 
     sphere.setTranslateZ(new Random().nextInt(200)); 
     items.add(sphere); 
    } 

    public void initialize() { 
     camera = new PerspectiveCamera(true); 
     camera.setNearClip(0.1); 
     camera.setFarClip(10000); 
     camera.setTranslateZ(-1000); 
     pane3D = new Group(camera); 
     SubScene subScene = new SubScene(pane3D, 400, 400, true, SceneAntialiasing.BALANCED); 
     subScene.setFill(Color.ROSYBROWN); 
     subScene.setCamera(camera); 
     pane.getChildren().add(subScene); 

     items = FXCollections.observableArrayList(); 

     items.addListener((ListChangeListener.Change<? extends Shape3D> c) -> { 
      while (c.next()) { 
       if (c.wasAdded()) { 
        c.getAddedSubList().forEach(i -> pane3D.getChildren().add(i)); 
       } 
      } 
     }); 

    }  

    @FXML 
    void rotateAll(ActionEvent event) { 
     items.forEach(s -> { 
      s.setRotate(new Random().nextInt(360)); 
      s.setRotationAxis(new Point3D(-100 + new Random().nextInt(200), 
        -100 + new Random().nextInt(200), new Random().nextInt(200))); 
     }); 
    } 

    @FXML 
    void translateAll(ActionEvent event) { 
     items.forEach(s -> { 
      s.setTranslateX(-100 + new Random().nextInt(200)); 
      s.setTranslateY(-100 + new Random().nextInt(200)); 
      s.setTranslateZ(new Random().nextInt(200)); 
     }); 

    } 
} 

subscene

+0

Lieber Jose, vielen Dank. Groß. Ich habe viel versucht. Ich dachte nicht, 'Shape3D' für die 'ObservableList' zu verwenden. – vegaonline

+0

Ich möchte ein wichtiges Problem im Zusammenhang mit diesem Problem wissen. Ich habe eine andere Klasse als 'myTube' oder' mySphere' definiert, die 'TriangleMesh' verwendet. Wenn ich eine Liste für diesen Fall erstellen muss, kann ich Shape3D nicht verwenden. Was soll ich für diese Fälle tun? – vegaonline

+1

Sie müssen das 'TriangleMesh'-Objekt zu einem' MeshView'-Knoten hinzufügen, der sich ebenfalls von 'Shape3D 'erstreckt. –

Verwandte Themen