예제 #1
0
  @Override
  public void start(Stage primaryStage) throws Exception {
    Group sceneRoot = new Group();
    Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED);
    scene.setFill(Color.BLACK);
    camera = new PerspectiveCamera(true);

    // setup camera transform for rotational support
    cameraTransform.setTranslate(0, 0, 0);
    cameraTransform.getChildren().add(camera);
    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateX(0);
    camera.setTranslateZ(-1000);
    cameraTransform.ry.setAngle(-25.0);
    cameraTransform.rx.setAngle(-10.0);
    // add a Point Light for better viewing of the grid coordinate system
    PointLight light = new PointLight(Color.WHITE);
    cameraTransform.getChildren().add(new AmbientLight());
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    long time = System.currentTimeMillis();
    Group group = new Group(cameraTransform);
    List<Point3D> data = new ArrayList<>();

    //        // create some data
    //        IntStream.range(0,100000)
    //                .forEach(i->data.add(new Point3D((float)(30*Math.sin(50*i)),
    //                                    (float)(Math.sin(i)*(100+30*Math.cos(100*i))),
    //                                    (float)(Math.cos(i)*(100+30*Math.cos(200*i))),
    //                                    i))); // <-- f
    //        // and write to csv file
    //        Path out = Paths.get("output.txt");
    //
    // Files.write(out,data.stream().map(p3d->p3d.toCSV()).collect(Collectors.toList()),Charset.defaultCharset());

    // read from csv file
    Path out = getCSVFile(0);
    if (out != null) {
      Files.lines(out)
          .map(s -> s.split(";"))
          .forEach(
              s ->
                  data.add(
                      new Point3D(
                          Float.parseFloat(s[0]),
                          Float.parseFloat(s[1]),
                          Float.parseFloat(s[2]),
                          Float.parseFloat(s[3]))));
    }

    ScatterMesh scatter = new ScatterMesh(data, true, 1, 0);
    // DENSITY
    // texture is given by p.f value, don't change this!
    scatter.setTextureModeVertices3D(1530, p -> p.f);

    group.getChildren().add(scatter);
    sceneRoot.getChildren().addAll(group);

    // First person shooter keyboard movement
    scene.setOnKeyPressed(
        event -> {
          double change = 10.0;
          // Add shift modifier to simulate "Running Speed"
          if (event.isShiftDown()) {
            change = 50.0;
          }
          // What key did the user press?
          KeyCode keycode = event.getCode();
          // Step 2c: Add Zoom controls
          if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
          }
          if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
          }
          // Step 2d:  Add Strafe controls
          if (keycode == KeyCode.A) {
            camera.setTranslateX(camera.getTranslateX() - change);
          }
          if (keycode == KeyCode.D) {
            camera.setTranslateX(camera.getTranslateX() + change);
          }
        });

    scene.setOnMousePressed(
        (MouseEvent me) -> {
          mousePosX = me.getSceneX();
          mousePosY = me.getSceneY();
          mouseOldX = me.getSceneX();
          mouseOldY = me.getSceneY();
        });
    scene.setOnMouseDragged(
        (MouseEvent me) -> {
          mouseOldX = mousePosX;
          mouseOldY = mousePosY;
          mousePosX = me.getSceneX();
          mousePosY = me.getSceneY();
          mouseDeltaX = (mousePosX - mouseOldX);
          mouseDeltaY = (mousePosY - mouseOldY);

          double modifier = 10.0;
          double modifierFactor = 0.1;

          if (me.isControlDown()) {
            modifier = 0.1;
          }
          if (me.isShiftDown()) {
            modifier = 50.0;
          }
          if (me.isPrimaryButtonDown()) {
            cameraTransform.ry.setAngle(
                ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0)
                                % 360
                            + 540)
                        % 360
                    - 180); // +
            cameraTransform.rx.setAngle(
                ((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0)
                                % 360
                            + 540)
                        % 360
                    - 180); // -
          } else if (me.isSecondaryButtonDown()) {
            double z = camera.getTranslateZ();
            double newZ = z + mouseDeltaX * modifierFactor * modifier;
            camera.setTranslateZ(newZ);
          } else if (me.isMiddleButtonDown()) {
            cameraTransform.t.setX(
                cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // -
            cameraTransform.t.setY(
                cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // -
          }
        });

    primaryStage.setTitle("F(X)yz - ScatterMesh Test");
    primaryStage.setScene(scene);
    primaryStage.show();

    final boolean constantVertices = true;
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger(0);

    List<List<Number>> fullData = new ArrayList<>();

    if (constantVertices) {
      // if possible we can cache all the data
      Stream.of(0, 1, 2, 3, 4, 3, 2, 1)
          .forEach(
              i -> {
                Path out2 = getCSVFile(i);
                if (out2 != null) {
                  try {
                    List<Number> data2 = new ArrayList<>();
                    Files.lines(out2)
                        .map(s -> s.split(";"))
                        .forEach(
                            s -> {
                              float f = Float.parseFloat(s[3]);
                              // 4 vertices tetrahedra
                              data2.add(f);
                              data2.add(f);
                              data2.add(f);
                              data2.add(f);
                            });
                    fullData.add(data2);
                  } catch (IOException ex) {
                  }
                }
              });
    }

    AnimationTimer timerEffect =
        new AnimationTimer() {

          @Override
          public void handle(long now) {
            if (now > lastEffect + 50_000_000l) {
              try {
                //                        long t=System.currentTimeMillis();
                if (constantVertices && fullData != null) {
                  // Vertices coordinates are always the same: mesh is tha same, we only
                  // need to update F on each element
                  scatter.setFunctionData(fullData.get(count.get() % 8));
                  //                            System.out.println("t
                  // "+(System.currentTimeMillis()-t));
                } else {
                  // vertices coordinates may change in time, we need to create them all over again
                  // reading the files:
                  Path out2 =
                      getCSVFile(
                          (int) (Stream.of(0, 1, 2, 3, 4, 3, 2, 1).toArray()[count.get() % 8]));
                  if (out2 != null) {
                    List<Point3D> data2 = new ArrayList<>();
                    Files.lines(out2)
                        .map(s -> s.split(";"))
                        .forEach(
                            s ->
                                data2.add(
                                    new Point3D(
                                        Float.parseFloat(s[0]),
                                        Float.parseFloat(s[1]),
                                        Float.parseFloat(s[2]),
                                        Float.parseFloat(s[3]))));
                    scatter.setScatterData(data2);
                    scatter.setTextureModeVertices1D(1530, p -> p);
                  }
                  //                            System.out.println("t
                  // "+(System.currentTimeMillis()-t));
                }
              } catch (IOException ex) {
              }

              count.getAndIncrement();
              lastEffect = now;
            }
          }
        };
    timerEffect.start();
  }
예제 #2
0
  private void initFirstPersonControls(Scene scene) {

    // First person shooter keyboard movement
    scene.setOnKeyPressed(
        event -> {
          double change = 10.0;
          // Add shift modifier to simulate "Running Speed"
          if (event.isShiftDown()) {
            change = 50.0;
          }
          // What key did the user press?
          KeyCode keycode = event.getCode();
          // Step 2c: Add Zoom controls
          if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
          }
          if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
          }
          // Step 2d: Add Strafe controls
          if (keycode == KeyCode.A) {
            camera.setTranslateX(camera.getTranslateX() - change);
          }
          if (keycode == KeyCode.D) {
            camera.setTranslateX(camera.getTranslateX() + change);
          }
        });

    scene.setOnMousePressed(
        (MouseEvent me) -> {
          mousePosX = me.getSceneX();
          mousePosY = me.getSceneY();
          mouseOldX = me.getSceneX();
          mouseOldY = me.getSceneY();
        });
    scene.setOnMouseDragged(
        (MouseEvent me) -> {
          mouseOldX = mousePosX;
          mouseOldY = mousePosY;
          mousePosX = me.getSceneX();
          mousePosY = me.getSceneY();
          mouseDeltaX = (mousePosX - mouseOldX);
          mouseDeltaY = (mousePosY - mouseOldY);

          double modifier = 10.0;
          double modifierFactor = 0.1;

          if (me.isControlDown()) {
            modifier = 0.1;
          }
          if (me.isShiftDown()) {
            modifier = 50.0;
          }
          if (me.isPrimaryButtonDown()) {
            cameraTransform.ry.setAngle(
                ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0)
                                % 360
                            + 540)
                        % 360
                    - 180); // +
            cameraTransform.rx.setAngle(
                Utils.clamp(
                    -90,
                    (((cameraTransform.rx.getAngle()
                                        - mouseDeltaY * modifierFactor * modifier * 2.0)
                                    % 360
                                + 540)
                            % 360
                        - 180),
                    90)); // -

          } else if (me.isSecondaryButtonDown()) {
            double z = camera.getTranslateZ();
            double newZ = z + mouseDeltaX * modifierFactor * modifier;
            camera.setTranslateZ(newZ);
          } else if (me.isMiddleButtonDown()) {
            cameraTransform.t.setX(
                cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // -
            cameraTransform.t.setY(
                cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // -
          }
        });
  }
예제 #3
0
  @Override
  public void start(Stage primaryStage) throws Exception {
    Group sceneRoot = new Group();
    Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED);
    scene.setFill(Color.BLACK);
    camera = new PerspectiveCamera(true);
    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateZ(-1000);
    scene.setCamera(camera);

    ArrayList<Point3D> points = new ArrayList<>();
    for (int i = -250; i < 250; i++) {
      points.add(
          new Point3D((float) i, (float) Math.sin(i) * 50 + i, (float) Math.cos(i) * 50 + i));
    }
    polyLine3D = new PolyLine3D(points, 3, Color.STEELBLUE);
    sceneRoot.getChildren().addAll(polyLine3D);

    scene.setOnKeyPressed(
        event -> {
          double change = 10.0;
          // Add shift modifier to simulate "Running Speed"
          if (event.isShiftDown()) {
            change = 50.0;
          }
          // What key did the user press?
          KeyCode keycode = event.getCode();
          // Step 2c: Add Zoom controls
          if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
          }
          if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
          }
          // Step 2d:  Add Strafe controls
          if (keycode == KeyCode.A) {
            camera.setTranslateX(camera.getTranslateX() - change);
          }
          if (keycode == KeyCode.D) {
            camera.setTranslateX(camera.getTranslateX() + change);
          }
        });

    // Add a Mouse Handler for Rotations
    Rotate xRotate = new Rotate(0, Rotate.X_AXIS);
    Rotate yRotate = new Rotate(0, Rotate.Y_AXIS);
    Rotate zRotate = new Rotate(0, Rotate.Z_AXIS);

    polyLine3D.getTransforms().addAll(xRotate, yRotate);
    // Use Binding so your rotation doesn't have to be recreated
    xRotate.angleProperty().bind(angleX);
    yRotate.angleProperty().bind(angleY);
    zRotate.angleProperty().bind(angleZ);

    // Start Tracking mouse movements only when a button is pressed
    scene.setOnMousePressed(
        event -> {
          scenex = event.getSceneX();
          sceney = event.getSceneY();
          fixedXAngle = angleX.get();
          fixedYAngle = angleY.get();
          if (event.isMiddleButtonDown()) {
            scenez = event.getSceneX();
            fixedZAngle = angleZ.get();
          }
        });
    // Angle calculation will only change when the button has been pressed
    scene.setOnMouseDragged(
        event -> {
          if (event.isMiddleButtonDown()) angleZ.set(fixedZAngle - (scenez - event.getSceneY()));
          else angleX.set(fixedXAngle - (scenex - event.getSceneY()));
          angleY.set(fixedYAngle + sceney - event.getSceneX());
        });

    primaryStage.setTitle("F(X)yz ScatterPlotTest");
    primaryStage.setScene(scene);
    primaryStage.show();
  }