Search in sources :

Example 41 with PerspectiveCamera

use of javafx.scene.PerspectiveCamera in project FXyzLib by Birdasaur.

the class TorusTest method start.

@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);
    // Setup camera and scatterplot cubeviewer
    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.setTranslateZ(-5000);
    cameraTransform.ry.setAngle(-45.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(light);
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    // Make a bunch of semi random Torusesessses(toroids?) and stuff
    Group torusGroup = new Group();
    torusGroup.getChildren().add(cameraTransform);
    for (int i = 0; i < 30; i++) {
        Random r = new Random();
        // A lot of magic numbers in here that just artificially constrain the math
        float randomRadius = (float) ((r.nextFloat() * 300) + 50);
        float randomTubeRadius = (float) ((r.nextFloat() * 100) + 1);
        int randomTubeDivisions = (int) ((r.nextFloat() * 64) + 1);
        int randomRadiusDivisions = (int) ((r.nextFloat() * 64) + 1);
        Color randomColor = new Color(r.nextDouble(), r.nextDouble(), r.nextDouble(), r.nextDouble());
        Torus torus = new Torus(randomTubeDivisions, randomRadiusDivisions, randomRadius, randomTubeRadius, randomColor);
        double translationX = Math.random() * sceneWidth * 1.95;
        if (Math.random() >= 0.5)
            translationX *= -1;
        double translationY = Math.random() * sceneWidth * 1.95;
        if (Math.random() >= 0.5)
            translationY *= -1;
        double translationZ = Math.random() * sceneWidth * 1.95;
        if (Math.random() >= 0.5)
            translationZ *= -1;
        Translate translate = new Translate(translationX, translationY, translationZ);
        Rotate rotateX = new Rotate(Math.random() * 360, Rotate.X_AXIS);
        Rotate rotateY = new Rotate(Math.random() * 360, Rotate.Y_AXIS);
        Rotate rotateZ = new Rotate(Math.random() * 360, Rotate.Z_AXIS);
        torus.getTransforms().addAll(translate, rotateX, rotateY, rotateZ);
        // torus.getTransforms().add(translate);
        torusGroup.getChildren().add(torus);
    }
    sceneRoot.getChildren().addAll(torusGroup);
    // 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 TorusTest");
    primaryStage.setScene(scene);
    primaryStage.show();
}
Also used : Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) Torus(org.fxyz.shapes.Torus) Color(javafx.scene.paint.Color) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) Random(java.util.Random) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) Translate(javafx.scene.transform.Translate)

Example 42 with PerspectiveCamera

use of javafx.scene.PerspectiveCamera in project FXyzLib by Birdasaur.

the class Drag3DObject method loadCamera.

private void loadCamera(Scene scene) {
    // initialize camera
    camera = new PerspectiveCamera(true);
    camera.setVerticalFieldOfView(RUN_JASON);
    // setup camera transform for rotational support
    cameraTransform.setTranslate(0, 0, 0);
    cameraTransform.getChildren().add(camera);
    camera.setNearClip(0.1);
    camera.setFarClip(100000.0);
    camera.setTranslateZ(-5000);
    cameraTransform.ry.setAngle(0.0);
    cameraTransform.rx.setAngle(-45.0);
    // add a Point Light for better viewing of the grid coordinate system
    PointLight light = new PointLight(Color.GAINSBORO);
    cameraTransform.getChildren().add(light);
    cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    // attach camera to scene
    scene.setCamera(camera);
}
Also used : PerspectiveCamera(javafx.scene.PerspectiveCamera) PointLight(javafx.scene.PointLight) AmbientLight(javafx.scene.AmbientLight)

Example 43 with PerspectiveCamera

use of javafx.scene.PerspectiveCamera in project FXyzLib by Birdasaur.

the class FrustumTest method start.

@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.WHITESMOKE);
    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.setTranslateZ(-30);
    // cameraTransform.ry.setAngle(-45.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(light);
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(10 * camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    // cylinder = new PrismMesh(2,5,4);
    // ,new Point3D(-5,5,0),new Point3D(0,0,5));
    cylinder = new FrustumMesh(1, 0.2, 4, 3);
    // cylinder.setDrawMode(DrawMode.LINE);
    // SECTION TYPE
    // cylinder.setSectionType(TriangleMeshHelper.SectionType.TRIANGLE);
    // NONE
    // cylinder.setTextureModeNone(Color.ROYALBLUE);
    // IMAGE
    // cylinder.setTextureModeImage(getClass().getResource("res/netCylinder.png").toExternalForm());
    cylinder.setTextureModeVertices1D(1530, t -> t);
    // cylinder.setColorPalette(ColorPalette.GREEN);
    // DENSITY
    // cylinder.setTextureModeVertices3D(1530,p->(double)p.y);
    // cylinder.setTextureModeVertices3D(1530,p->(double)cylinder.unTransform(p).magnitude());
    // FACES
    // cylinder.setTextureModeFaces(1530);
    cylinder.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().add(cylinder);
    boolean showKnots = true;
    if (showKnots) {
        Sphere s = new Sphere(cylinder.getMajorRadius() / 10d);
        Point3D k0 = cylinder.getAxisOrigin();
        s.getTransforms().add(new Translate(k0.x, k0.y, k0.z));
        s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
        group.getChildren().add(s);
        s = new Sphere(cylinder.getMinorRadius() / 10d);
        Point3D k3 = cylinder.getAxisEnd();
        s.getTransforms().add(new Translate(k3.x, k3.y, k3.z));
        s.setMaterial(new PhongMaterial(Color.ROSYBROWN));
        group.getChildren().add(s);
    }
    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 - Cylinder Test");
    primaryStage.setScene(scene);
    primaryStage.show();
    // OBJWriter writer=new OBJWriter((TriangleMesh) cylinder.getMesh(),"cylinder2");
    // //        writer.setMaterialColor(Color.AQUA);
    // //        writer.setTextureImage(getClass().getResource("res/netCylinder.png").toExternalForm());
    // writer.setTextureColors(6,ColorPalette.GREEN);
    // writer.exportMesh();
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger(0);
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 100_000_000l) {
                // <=1/6d)?1d:0d;
                func = t -> Math.pow(Math.sin(8d * Math.PI * (10d * (1 - t.doubleValue()) + count.get() % 11) / 20d), 6);
                cylinder.setFunction(func);
                // mapBez.values().forEach(b->b.setDensity(dens));
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    timerEffect.start();
}
Also used : Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) AnimationTimer(javafx.animation.AnimationTimer) FrustumMesh(org.fxyz.shapes.primitives.FrustumMesh) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) Sphere(javafx.scene.shape.Sphere) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) PhongMaterial(javafx.scene.paint.PhongMaterial) Translate(javafx.scene.transform.Translate)

Example 44 with PerspectiveCamera

use of javafx.scene.PerspectiveCamera in project FXyzLib by Birdasaur.

the class Function2DPlotTest method start.

@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.WHITESMOKE);
    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.setTranslateZ(-20);
    cameraTransform.ry.setAngle(-45.0);
    cameraTransform.rx.setAngle(-30.0);
    // add a Point Light for better viewing of the grid coordinate system
    PointLight light = new PointLight(Color.WHITE);
    cameraTransform.getChildren().add(light);
    // cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    surface = new SurfacePlotMesh(p -> Math.sin(p.magnitude() + 0.00000000000000001) / (p.magnitude() + 0.00000000000000001), 10, 10, 10, 10, 5d);
    // PhongMaterial matTorus = new PhongMaterial(Color.FIREBRICK);
    // torus.setMaterial(matTorus);
    // surface.setDrawMode(DrawMode.LINE);
    surface.setCullFace(CullFace.NONE);
    // NONE
    // surface.setTextureModeNone(Color.FORESTGREEN);
    // IMAGE
    // torus.setTextureModeImage(getClass().getResource("res/grid1.png").toExternalForm());
    // banner.setTextureModeImage(getClass().getResource("res/Duke3DprogressionSmall.jpg").toExternalForm());
    // PATTERN
    surface.setTextureModePattern(CarbonPatterns.CARBON_KEVLAR, 1.0d);
    // DENSITY
    // surface.setTextureModeVertices3D(1530,dens);
    // FACES
    // torus.setTextureModeFaces(256*256);
    surface.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().addAll(surface);
    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);
        }
    });
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger();
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 1_000_000_000l) {
                // dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
                // torus.setDensity(dens);
                // if(count.get()%100<50){
                // torus.setDrawMode(DrawMode.LINE);
                // } else {
                // torus.setDrawMode(DrawMode.FILL);
                // }
                // spring.setLength(100+20*(count.get()%10));
                // torus.setColors((int)Math.pow(2,count.get()%16));
                // torus.setMajorRadius(500+100*(count.get()%10));
                // torus.setMinorRadius(150+10*(count.get()%10));
                // torus.setPatternScale(1d+(count.get()%10)*5d);
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    primaryStage.setTitle("F(X)yz - Surface Plot 2D");
    primaryStage.setScene(scene);
    primaryStage.show();
// timerEffect.start();
}
Also used : Scene(javafx.scene.Scene) KeyCode(javafx.scene.input.KeyCode) Color(javafx.scene.paint.Color) CarbonPatterns(org.fxyz.utils.Patterns.CarbonPatterns) Rotate(javafx.scene.transform.Rotate) SurfacePlotMesh(org.fxyz.shapes.primitives.SurfacePlotMesh) MouseEvent(javafx.scene.input.MouseEvent) PointLight(javafx.scene.PointLight) Group(javafx.scene.Group) DrawMode(javafx.scene.shape.DrawMode) Function(java.util.function.Function) CullFace(javafx.scene.shape.CullFace) Application(javafx.application.Application) AnimationTimer(javafx.animation.AnimationTimer) PerspectiveCamera(javafx.scene.PerspectiveCamera) CameraTransformer(org.fxyz.cameras.CameraTransformer) Stage(javafx.stage.Stage) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Patterns(org.fxyz.utils.Patterns) SceneAntialiasing(javafx.scene.SceneAntialiasing) Point3D(org.fxyz.geometry.Point3D) Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) SurfacePlotMesh(org.fxyz.shapes.primitives.SurfacePlotMesh) AnimationTimer(javafx.animation.AnimationTimer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KeyCode(javafx.scene.input.KeyCode) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) PointLight(javafx.scene.PointLight)

Example 45 with PerspectiveCamera

use of javafx.scene.PerspectiveCamera in project FXyzLib by Birdasaur.

the class KnotTest method start.

@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.WHEAT);
    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.setTranslateZ(-30);
    cameraTransform.ry.setAngle(-45.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(light);
    cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    knot = new KnotMesh(2d, 1d, 0.4d, 2d, 3d, 1000, 60, 0, 0);
    knot.setDrawMode(DrawMode.LINE);
    // knot.setCullFace(CullFace.NONE);
    knot.setSectionType(SectionType.TRIANGLE);
    // NONE
    // knot.setTextureModeNone(Color.BROWN);
    // IMAGE
    // knot.setTextureModeImage(getClass().getResource("res/LaminateSteel.jpg").toExternalForm());
    // PATTERN
    // knot.setTextureModePattern(3d);
    // FUNCTION
    // knot.setTextureModeVertices1D(1530,t->knot.getTau(t));
    knot.setTextureModeVertices1D(ColorPalette.GREEN, 8, t -> knot.getTau(t.doubleValue()));
    // DENSITY
    // knot.setTextureModeVertices3D(256*256,dens);
    // FACES
    // knot.setTextureModeFaces(256*256);
    knot.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().add(knot);
    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);
        }
    });
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger();
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 100_000_000l) {
                // Point3D loc = knot.getPositionAt((count.get()%100)*2d*Math.PI/100d);
                // Point3D dir = knot.getTangentAt((count.get()%100)*2d*Math.PI/100d);
                // cameraTransform.t.setX(loc.x);
                // cameraTransform.t.setY(loc.y);
                // cameraTransform.t.setZ(-loc.z);
                // javafx.geometry.Point3D axis = cameraTransform.rx.getAxis();
                // javafx.geometry.Point3D cross = axis.crossProduct(-dir.x,-dir.y,-dir.z);
                // double angle = axis.angle(-dir.x,-dir.y,-dir.z);
                // cameraTransform.rx.setAngle(angle);
                // cameraTransform.rx.setAxis(new javafx.geometry.Point3D(cross.getX(),-cross.getY(),cross.getZ()));
                // dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
                // knot.setDensity(dens);
                // knot.setP(1+(count.get()%5));
                // knot.setQ(2+(count.get()%15));
                // if(count.get()%100<50){
                // knot.setDrawMode(DrawMode.LINE);
                // } else {
                // knot.setDrawMode(DrawMode.FILL);
                // }
                // knot.setColors((int)Math.pow(2,count.get()%16));
                // knot.setMajorRadius(0.5d+(count.get()%10));
                // knot.setMinorRadius(2d+(count.get()%60));
                // knot.setWireRadius(0.1d+(count.get()%6)/10d);
                // knot.setPatternScale(1d+(count.get()%10)*3d);
                knot.setSectionType(SectionType.values()[count.get() % SectionType.values().length]);
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    primaryStage.setTitle("F(X)yz - Knots");
    primaryStage.setScene(scene);
    primaryStage.show();
    OBJWriter writer = new OBJWriter((TriangleMesh) knot.getMesh(), "knot");
    writer.setMaterialColor(Color.BROWN);
    writer.exportMesh();
    timerEffect.start();
}
Also used : Group(javafx.scene.Group) KnotMesh(org.fxyz.shapes.primitives.KnotMesh) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) AnimationTimer(javafx.animation.AnimationTimer) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) OBJWriter(org.fxyz.utils.OBJWriter) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) AmbientLight(javafx.scene.AmbientLight)

Aggregations

PerspectiveCamera (javafx.scene.PerspectiveCamera)51 Scene (javafx.scene.Scene)36 Group (javafx.scene.Group)31 KeyCode (javafx.scene.input.KeyCode)31 PointLight (javafx.scene.PointLight)28 Rotate (javafx.scene.transform.Rotate)25 MouseEvent (javafx.scene.input.MouseEvent)23 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)16 AnimationTimer (javafx.animation.AnimationTimer)14 KeyFrame (javafx.animation.KeyFrame)12 KeyValue (javafx.animation.KeyValue)12 Timeline (javafx.animation.Timeline)12 Point3D (org.fxyz.geometry.Point3D)11 AmbientLight (javafx.scene.AmbientLight)10 Translate (javafx.scene.transform.Translate)10 Color (javafx.scene.paint.Color)9 ArrayList (java.util.ArrayList)8 Interpolator (javafx.animation.Interpolator)7 OBJWriter (org.fxyz.utils.OBJWriter)7 PhongMaterial (javafx.scene.paint.PhongMaterial)6