Search in sources :

Example 6 with Cylinder

use of javafx.scene.shape.Cylinder in project FXyzLib by Birdasaur.

the class CuboidTest 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);
    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);
    cuboid = new CuboidMesh(10f, 12f, 4f, 5, new Point3D(0f, 0f, 0f));
    //        cuboid.setDrawMode(DrawMode.LINE);
    //        cuboid.setCullFace(CullFace.NONE);
    // NONE
    cuboid.setTextureModeNone(Color.ROYALBLUE);
    // IMAGE
    //        cuboid.setTextureModeImage(getClass().getResource("res/netCuboid.png").toExternalForm());
    // DENSITY
    //        cuboid.setTextureModeVertices3D(256*256,p->(double)p.x*p.y*p.z);
    // FACES
    //        cuboid.setTextureModeFaces(1530);
    cuboid.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().add(cuboid);
    boolean testRayIntersection = false;
    if (testRayIntersection) {
        /*
            RAY INTERSECTION
            */
        javafx.geometry.Point3D gloOrigin = new javafx.geometry.Point3D(4, -7, -4);
        javafx.geometry.Point3D gloTarget = new javafx.geometry.Point3D(2, 3, 4);
        javafx.geometry.Point3D gloDirection = gloTarget.subtract(gloOrigin).normalize();
        javafx.geometry.Point3D gloOriginInLoc = cuboid.sceneToLocal(gloOrigin);
        Bounds locBounds = cuboid.getBoundsInLocal();
        Bounds gloBounds = cuboid.localToScene(locBounds);
        Sphere s = new Sphere(0.05d);
        s.getTransforms().add(new Translate(gloOrigin.getX(), gloOrigin.getY(), gloOrigin.getZ()));
        s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
        group.getChildren().add(s);
        s = new Sphere(0.05d);
        s.getTransforms().add(new Translate(gloTarget.getX(), gloTarget.getY(), gloTarget.getZ()));
        s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
        group.getChildren().add(s);
        javafx.geometry.Point3D dir = gloTarget.subtract(gloOrigin).crossProduct(new javafx.geometry.Point3D(0, -1, 0));
        double angle = Math.acos(gloTarget.subtract(gloOrigin).normalize().dotProduct(new javafx.geometry.Point3D(0, -1, 0)));
        double h1 = gloTarget.subtract(gloOrigin).magnitude();
        Cylinder c = new Cylinder(0.03d, h1);
        c.getTransforms().addAll(new Translate(gloOrigin.getX(), gloOrigin.getY() - h1 / 2d, gloOrigin.getZ()), new Rotate(-Math.toDegrees(angle), 0d, h1 / 2d, 0d, new javafx.geometry.Point3D(dir.getX(), -dir.getY(), dir.getZ())));
        c.setMaterial(new PhongMaterial(Color.GREEN));
        group.getChildren().add(c);
        group.getChildren().add(new Axes(0.02));
        Box box = new Box(gloBounds.getWidth(), gloBounds.getHeight(), gloBounds.getDepth());
        box.setDrawMode(DrawMode.LINE);
        box.setMaterial(new PhongMaterial(Color.BLUEVIOLET));
        box.getTransforms().add(new Translate(gloBounds.getMinX() + gloBounds.getWidth() / 2d, gloBounds.getMinY() + gloBounds.getHeight() / 2d, gloBounds.getMinZ() + gloBounds.getDepth() / 2d));
        //        group.getChildren().add(box);
        /*
            FIRST STEP; Check the ray crosses the bounding box of the shape at any of
            its 6 faces
            */
        List<javafx.geometry.Point3D> normals = Arrays.asList(new javafx.geometry.Point3D(-1, 0, 0), new javafx.geometry.Point3D(1, 0, 0), new javafx.geometry.Point3D(0, -1, 0), new javafx.geometry.Point3D(0, 1, 0), new javafx.geometry.Point3D(0, 0, -1), new javafx.geometry.Point3D(0, 0, 1));
        List<javafx.geometry.Point3D> positions = Arrays.asList(new javafx.geometry.Point3D(locBounds.getMinX(), 0, 0), new javafx.geometry.Point3D(locBounds.getMaxX(), 0, 0), new javafx.geometry.Point3D(0, locBounds.getMinY(), 0), new javafx.geometry.Point3D(0, locBounds.getMaxY(), 0), new javafx.geometry.Point3D(0, 0, locBounds.getMinZ()), new javafx.geometry.Point3D(0, 0, locBounds.getMaxZ()));
        AtomicInteger counter = new AtomicInteger();
        IntStream.range(0, 6).forEach(i -> {
            double d = -normals.get(i).dotProduct(positions.get(i));
            double t = -(gloOriginInLoc.dotProduct(normals.get(i)) + d) / (gloDirection.dotProduct(normals.get(i)));
            javafx.geometry.Point3D locInter = gloOriginInLoc.add(gloDirection.multiply(t));
            if (locBounds.contains(locInter)) {
                counter.getAndIncrement();
                javafx.geometry.Point3D gloInter = cuboid.localToScene(locInter);
                Sphere s2 = new Sphere(0.1d);
                s2.getTransforms().add(new Translate(gloInter.getX(), gloInter.getY(), gloInter.getZ()));
                s2.setMaterial(new PhongMaterial(Color.GOLD));
            }
        });
        if (counter.get() > 0) {
            /*
                SECOND STEP: Check if the ray crosses any of the triangles of the mesh
                */
            // triangle mesh
            org.fxyz.geometry.Point3D gloOriginInLoc1 = new org.fxyz.geometry.Point3D((float) gloOriginInLoc.getX(), (float) gloOriginInLoc.getY(), (float) gloOriginInLoc.getZ());
            org.fxyz.geometry.Point3D gloDirection1 = new org.fxyz.geometry.Point3D((float) gloDirection.getX(), (float) gloDirection.getY(), (float) gloDirection.getZ());
            System.out.println("number of intersections: " + cuboid.getIntersections(gloOriginInLoc1, gloDirection1));
        }
    }
    sceneRoot.getChildren().addAll(group);
    //First person shooter keyboard movement 
    scene.setOnKeyPressed(event -> {
        double change = 10.0;
        if (event.isShiftDown()) {
            change = 50.0;
        }
        KeyCode keycode = event.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);
        }
    });
    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 - Cuboid Test");
    primaryStage.setScene(scene);
    primaryStage.show();
    OBJWriter writer = new OBJWriter((TriangleMesh) cuboid.getMesh(), "cuboid");
    //        writer.setMaterialColor(Color.AQUA);
    //        writer.setTextureImage(getClass().getResource("res/netCuboid.png").toExternalForm());
    writer.setTextureColors(256 * 256);
    writer.exportMesh();
}
Also used : Group(javafx.scene.Group) Rotate(javafx.scene.transform.Rotate) PerspectiveCamera(javafx.scene.PerspectiveCamera) OBJWriter(org.fxyz.utils.OBJWriter) Sphere(javafx.scene.shape.Sphere) Axes(org.fxyz.utils.Axes) KeyCode(javafx.scene.input.KeyCode) PhongMaterial(javafx.scene.paint.PhongMaterial) Translate(javafx.scene.transform.Translate) CuboidMesh(org.fxyz.shapes.primitives.CuboidMesh) MouseEvent(javafx.scene.input.MouseEvent) Bounds(javafx.geometry.Bounds) Box(javafx.scene.shape.Box) Scene(javafx.scene.Scene) Cylinder(javafx.scene.shape.Cylinder) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) PointLight(javafx.scene.PointLight) Point3D(org.fxyz.geometry.Point3D)

Example 7 with Cylinder

use of javafx.scene.shape.Cylinder in project FXyzLib by Birdasaur.

the class CubeWorld method buildGrids.

private void buildGrids(double size, double spacing) {
    //fill in grid lines for X Axis
    PhongMaterial phong = new PhongMaterial();
    phong.setSpecularColor(gridLinesWallColor);
    phong.setDiffuseColor(gridLinesWallColor);
    ArrayList xy1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX((-size / 2) + i);
        newCyl.setTranslateZ(-size / 2);
        xy1Cyls.add(newCyl);
    }
    xy1GridLinesGroup = new Group(xy1Cyls);
    //Now build the grids for the mirror image
    ArrayList xy2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX((-size / 2) + i);
        newCyl.setTranslateZ(size / 2);
        xy2Cyls.add(newCyl);
    }
    xy2GridLinesGroup = new Group(xy2Cyls);
    ArrayList xx1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateZ(-size / 2);
        newCyl.setTranslateY((size / 2) - i);
        newCyl.setRotationAxis(Rotate.Z_AXIS);
        newCyl.setRotate(90);
        xx1Cyls.add(newCyl);
    }
    xx1GridLinesGroup = new Group(xx1Cyls);
    //Now build the grids for the mirror image
    ArrayList xx2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateZ(size / 2);
        newCyl.setTranslateY((size / 2) - i);
        newCyl.setRotationAxis(Rotate.Z_AXIS);
        newCyl.setRotate(90);
        xx2Cyls.add(newCyl);
    }
    xx2GridLinesGroup = new Group(xx2Cyls);
    //Add the sub groups to the parent group 
    getChildren().addAll(xy1GridLinesGroup);
    getChildren().addAll(xx1GridLinesGroup);
    getChildren().addAll(xy2GridLinesGroup);
    getChildren().addAll(xx2GridLinesGroup);
    // File in grid Lines for Y Axis //////////////////////////
    ArrayList yy1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX(-size / 2);
        newCyl.setTranslateZ((-size / 2) + i);
        yy1Cyls.add(newCyl);
    }
    yy1GridLinesGroup = new Group(yy1Cyls);
    //Now build the grids for the mirror image
    ArrayList yy2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX(size / 2);
        newCyl.setTranslateZ((-size / 2) + i);
        yy2Cyls.add(newCyl);
    }
    yy2GridLinesGroup = new Group(yy2Cyls);
    ArrayList yx1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX(-size / 2);
        newCyl.setTranslateY((size / 2) - i);
        newCyl.setRotationAxis(Rotate.X_AXIS);
        newCyl.setRotate(90);
        yx1Cyls.add(newCyl);
    }
    yx1GridLinesGroup = new Group(yx1Cyls);
    //Now build the grids for the mirror image
    ArrayList yx2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateX(size / 2);
        newCyl.setTranslateY((size / 2) - i);
        newCyl.setRotationAxis(Rotate.X_AXIS);
        newCyl.setRotate(90);
        yx2Cyls.add(newCyl);
    }
    yx2GridLinesGroup = new Group(yx2Cyls);
    //Add the sub groups to the parent group
    getChildren().addAll(yy1GridLinesGroup);
    getChildren().addAll(yx1GridLinesGroup);
    getChildren().addAll(yy2GridLinesGroup);
    getChildren().addAll(yx2GridLinesGroup);
    // File in grid Lines for Z Axis //////////////////////////
    phong = new PhongMaterial();
    phong.setSpecularColor(gridLinesFloorColor);
    phong.setDiffuseColor(gridLinesFloorColor);
    ArrayList zy1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateY(size / 2);
        newCyl.setTranslateX((-size / 2) + i);
        newCyl.setRotationAxis(Rotate.X_AXIS);
        newCyl.setRotate(90);
        zy1Cyls.add(newCyl);
    }
    zy1GridLinesGroup = new Group(zy1Cyls);
    //Now build the grids for the mirror image
    ArrayList zy2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateY(-size / 2);
        newCyl.setTranslateX((-size / 2) + i);
        newCyl.setRotationAxis(Rotate.X_AXIS);
        newCyl.setRotate(90);
        zy2Cyls.add(newCyl);
    }
    zy2GridLinesGroup = new Group(zy2Cyls);
    ArrayList zx1Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateY(size / 2);
        newCyl.setTranslateZ((-size / 2) + i);
        newCyl.setRotationAxis(Rotate.Z_AXIS);
        newCyl.setRotate(90);
        zx1Cyls.add(newCyl);
    }
    zx1GridLinesGroup = new Group(zx1Cyls);
    //Now build the grids for the mirror image
    ArrayList zx2Cyls = new ArrayList<>();
    for (int i = 0; i < size; i += spacing) {
        Cylinder newCyl = new Cylinder(gridSize, size);
        newCyl.setMaterial(phong);
        newCyl.setTranslateY(-size / 2);
        newCyl.setTranslateZ((-size / 2) + i);
        newCyl.setRotationAxis(Rotate.Z_AXIS);
        newCyl.setRotate(90);
        zx2Cyls.add(newCyl);
    }
    zx2GridLinesGroup = new Group(zx2Cyls);
    //Add the sub groups to the parent group
    getChildren().addAll(zy1GridLinesGroup);
    getChildren().addAll(zx1GridLinesGroup);
    getChildren().addAll(zy2GridLinesGroup);
    getChildren().addAll(zx2GridLinesGroup);
}
Also used : Cylinder(javafx.scene.shape.Cylinder) Group(javafx.scene.Group) ArrayList(java.util.ArrayList) PhongMaterial(javafx.scene.paint.PhongMaterial)

Aggregations

Cylinder (javafx.scene.shape.Cylinder)7 Group (javafx.scene.Group)5 PhongMaterial (javafx.scene.paint.PhongMaterial)5 Sphere (javafx.scene.shape.Sphere)4 ArrayList (java.util.ArrayList)3 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Bounds (javafx.geometry.Bounds)2 PerspectiveCamera (javafx.scene.PerspectiveCamera)2 PointLight (javafx.scene.PointLight)2 Scene (javafx.scene.Scene)2 KeyCode (javafx.scene.input.KeyCode)2 MouseEvent (javafx.scene.input.MouseEvent)2 Box (javafx.scene.shape.Box)2 Rotate (javafx.scene.transform.Rotate)2 Translate (javafx.scene.transform.Translate)2 Axes (org.fxyz.utils.Axes)2 Point3D (javafx.geometry.Point3D)1 AmbientLight (javafx.scene.AmbientLight)1 Point3D (org.fxyz.geometry.Point3D)1 CuboidMesh (org.fxyz.shapes.primitives.CuboidMesh)1