0

球体、チューブ、立方体などの 3D ジオメトリ オブジェクトがいくつかSphereあります。これは、オブジェクトがメソッドの種類に対してローカルであることを意味します。CylinderBoxFXMLcontrollerbox1@FXMLmakeCube

ここで、このコントローラー内の別のメソッドで、ブール演算、コピー、ミラーリングなどのいくつかの操作を実行したいと考えています。作成されたすべてのジオメトリをリストの JavaFXCollection ソートに保持して、他のメソッド内からそれらのジオメトリへのハンドルを呼び出すことができるようにします。

私の質問は、どうすればこれを行うことができますか? 同じ内の他のメソッドでこのハンドルを参照するにはどうすればよいFXMLControllerですか?

ネットで正確な質問が見つかりませんでした。

4

1 に答える 1

1

これらの 3D オブジェクトはすべて から拡張されているため、これらすべての 3D オブジェクトを 1 つのコレクションに配置できますShape3D

コレクションを作成し、ObservableList<Shape3D>作成時に各オブジェクトをコレクションに追加できます。その後、コレクション内の変更をリッスンし、すべての新しいオブジェクトをシーン/サブシーンに追加できます。

Boxこれは、ランダム オブジェクトまたはSphere3D オブジェクトを作成し、コレクションに追加して、サブシーンに配置できる 4 つのボタンを持つコントローラーのサンプルです。

また、完全なコレクションで操作を実行することもできます (この場合は平行移動または回転)。

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));
        });

    }
}

サブシーン

于 2016-05-21T14:36:15.900 に答える