Search in sources :

Example 1 with Ray

use of org.fxyz.geometry.Ray in project FXyzLib by Birdasaur.

the class SimpleRayTest method animateRayTo.

/**
     *  Creates and launches a custom Transition animation
     * 
     * @param r The Ray that holds the info
     * @param tx to x
     * @param ty to y
     * @param tz to z
     * @param dps distance per step to move ray
     * @param time length of animation
     */
private void animateRayTo(final Ray r, final Sphere target, final Duration time) {
    final Transition t = new Transition() {

        protected Ray ray;

        protected Sphere s;

        protected double dist;

        {
            this.ray = r;
            this.s = new Sphere(5);
            s.setTranslateX((ray.getOrigin()).getX());
            s.setTranslateY((ray.getOrigin()).getY());
            s.setTranslateZ((ray.getOrigin()).getZ());
            s.setMaterial(highlight);
            rayLight.getScope().add(s);
            this.dist = ray.getOrigin().distance(Point3D.ZERO.add(target.getTranslateX(), target.getTranslateY(), target.getTranslateZ()));
            setCycleDuration(time);
            this.setInterpolator(Interpolator.LINEAR);
            this.setOnFinished(e -> {
                if (target.getBoundsInParent().contains(ray.getPosition())) {
                    target.setMaterial(highlight);
                    PauseTransition t = new PauseTransition(Duration.millis(750));
                    t.setOnFinished(pe -> {
                        reset();
                        root.getChildren().removeAll(s);
                        s = null;
                    });
                    t.playFromStart();
                }
            });
            root.getChildren().add(s);
        }

        @Override
        protected void interpolate(double frac) {
            // frac-> 0.0 - 1.0 
            // project ray 
            ray.project(dist * frac);
            // set the sphere to ray position
            s.setTranslateX(ray.getPosition().getX());
            s.setTranslateY(ray.getPosition().getY());
            s.setTranslateZ(ray.getPosition().getZ());
        }
    };
    t.playFromStart();
}
Also used : Sphere(javafx.scene.shape.Sphere) Transition(javafx.animation.Transition) PauseTransition(javafx.animation.PauseTransition) PauseTransition(javafx.animation.PauseTransition) Ray(org.fxyz.geometry.Ray)

Example 2 with Ray

use of org.fxyz.geometry.Ray in project FXyzLib by Birdasaur.

the class SimpleRayTest method start.

@Override
public void start(Stage primaryStage) throws Exception {
    // add cameraTransform so it doesn't affect all nodes
    rayLight.getScope().add(cameraTransform);
    camera = new PerspectiveCamera(true);
    cameraTransform.setTranslate(0, 0, 0);
    cameraTransform.getChildren().addAll(camera);
    camera.setNearClip(0.1);
    camera.setFarClip(1000000.0);
    camera.setFieldOfView(42);
    camera.setTranslateZ(-5000);
    PointLight light = new PointLight(Color.GAINSBORO);
    PointLight light2 = new PointLight(Color.YELLOW);
    light2.setTranslateY(-2000);
    //create a target
    target1 = new Sphere(100);
    target1.setTranslateX(300);
    target1.setTranslateY(300);
    target1.setTranslateZ(1000);
    target1.setMaterial(red);
    // create another target
    target2 = new Sphere(100);
    target2.setTranslateX(800);
    target2.setTranslateY(-1200);
    target2.setTranslateZ(-500);
    target2.setMaterial(blue);
    root.getChildren().addAll(cameraTransform, target1, target2, light, light2, rayLight);
    root.setAutoSizeChildren(false);
    Scene scene = new Scene((root), 1200, 800, true, SceneAntialiasing.BALANCED);
    scene.setCamera(camera);
    Stop[] stops = new Stop[] { new Stop(0, Color.BLACK), new Stop(0.5, Color.DEEPSKYBLUE.darker()), new Stop(1.0, Color.BLACK) };
    LinearGradient lg = new LinearGradient(0, 0, 0, 1, true, CycleMethod.NO_CYCLE, stops);
    scene.setFill(lg);
    //First person shooter keyboard movement
    scene.setOnKeyPressed(ke -> {
        double change = 10.0;
        if (ke.isShiftDown()) {
            change = 50.0;
        }
        KeyCode keycode = ke.getCode();
        if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
        }
        if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
        }
        if (keycode == KeyCode.A) {
            camera.setTranslateX(camera.getTranslateX() - change);
        }
        if (keycode == KeyCode.D) {
            camera.setTranslateX(camera.getTranslateX() + change);
        }
        if (keycode == KeyCode.CONTROL) {
            fireRay = false;
        }
    });
    scene.setOnKeyReleased(ke -> {
        if (ke.getCode().equals(KeyCode.CONTROL)) {
            fireRay = true;
        }
    });
    scene.setOnMousePressed(e -> {
        mousePosX = e.getSceneX();
        mousePosY = e.getSceneY();
        mouseOldX = e.getSceneX();
        mouseOldY = e.getSceneY();
        if (fireRay) {
            Point3D o = e.getPickResult().getIntersectedPoint();
            if (e.isPrimaryButtonDown()) {
                Point3D t = Point3D.ZERO.add(target2.getTranslateX(), target2.getTranslateY(), target2.getTranslateZ()), d = t.subtract(o);
                Ray r = new Ray(o, d);
                double dist = t.distance(o);
                if (target2.getBoundsInParent().contains(r.project(dist))) {
                    animateRayTo(r, target2, Duration.seconds(2));
                    System.out.println("Target Contains Ray!\n" + r + "\nTarget Bounds: " + target2.getBoundsInParent() + "\nDistance: " + dist + "\n");
                }
                e.consume();
            } else if (e.isSecondaryButtonDown()) {
                Point3D tgt = Point3D.ZERO.add(target1.getTranslateX(), target1.getTranslateY(), target1.getTranslateZ()), dir = tgt.subtract(o);
                Ray r = new Ray(o, dir);
                double dist = tgt.distance(o);
                if (target1.getBoundsInParent().contains(r.project(dist))) {
                    animateRayTo(r, target1, Duration.seconds(2));
                    System.out.println("Target Contains Ray: " + target1.getBoundsInParent().contains(r.project(dist)) + "\n" + r + "\nTarget Bounds: " + target1.getBoundsInParent() + "\nDistance: " + dist + "\n");
                }
                e.consume();
            }
        }
    });
    scene.setOnMouseDragged(e -> {
        if (!fireRay) {
            mouseOldX = mousePosX;
            mouseOldY = mousePosY;
            mousePosX = e.getSceneX();
            mousePosY = e.getSceneY();
            mouseDeltaX = (mousePosX - mouseOldX);
            mouseDeltaY = (mousePosY - mouseOldY);
            double modifier = 10.0;
            double modifierFactor = 0.1;
            if (e.isControlDown()) {
                modifier = 0.1;
            }
            if (e.isShiftDown()) {
                modifier = 50.0;
            }
            if (e.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 (e.isSecondaryButtonDown()) {
                double z = camera.getTranslateZ();
                double newZ = z + mouseDeltaX * modifierFactor * modifier;
                camera.setTranslateZ(newZ);
            } else if (e.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("Hello Ray! Animated Visual of a Ray casting");
    primaryStage.setScene(scene);
    primaryStage.show();
}
Also used : Sphere(javafx.scene.shape.Sphere) LinearGradient(javafx.scene.paint.LinearGradient) Stop(javafx.scene.paint.Stop) Point3D(javafx.geometry.Point3D) KeyCode(javafx.scene.input.KeyCode) PerspectiveCamera(javafx.scene.PerspectiveCamera) Ray(org.fxyz.geometry.Ray) PointLight(javafx.scene.PointLight) Scene(javafx.scene.Scene)

Aggregations

Sphere (javafx.scene.shape.Sphere)2 Ray (org.fxyz.geometry.Ray)2 PauseTransition (javafx.animation.PauseTransition)1 Transition (javafx.animation.Transition)1 Point3D (javafx.geometry.Point3D)1 PerspectiveCamera (javafx.scene.PerspectiveCamera)1 PointLight (javafx.scene.PointLight)1 Scene (javafx.scene.Scene)1 KeyCode (javafx.scene.input.KeyCode)1 LinearGradient (javafx.scene.paint.LinearGradient)1 Stop (javafx.scene.paint.Stop)1