javafx Shape3D с рамкой

Я делаю приложение с огромным количеством 3D-фигур, и мне нужно, чтобы они были полностью прозрачными и с рамкой. Я пытался найти способ применить границу к Shape3D, особенно к Box и Sphere, но ничего не нашел. Итак, мои вопросы:

  • Есть ли способ добавить границу в Shape3D?
  • Если да, то как это сделать?

person J. Doe    schedule 23.03.2017    source источник
comment
Я думаю, вы не говорите о рисовании каркасов с использованием drawMode DrawMode.LINE???   -  person fabian    schedule 23.03.2017
comment
Вы не можете добавить границу к произвольному Shape3D в JavaFX через API.   -  person Birdasaur    schedule 24.03.2017
comment
Вы можете создать вторую сетку, которая по существу повторяет вершины первой сетки, используя алгоритм, подобный алгоритму PolyLine3D на FXyz3d.org. По сути, это создаст каркасную структуру в виде единой сетки. Какой бы алгоритм вы ни реализовали, он должен будет до некоторой степени имитировать схему намотки оригинальной сетки. Вероятно, это должно быть индивидуально для каждой конкретной сетки. Я не уверен, что такой общий алгоритм трассировки возможен. (по крайней мере, в JavaFX 3D)   -  person Birdasaur    schedule 24.03.2017


Ответы (2)


Нет, нет возможности добавить границы к 3D-фигурам, но вместо этого вы можете использовать очень тонкие цилиндры (однако работает только для коробок):

    public void createBoxLines(double contW, double contH, double contD, double x, double y, double z) {
       //You call this method to create a box with a size and location you put in
        //This method calls the createLine method for all the sides of your rectangle
        Point3D p1 = new Point3D(x, y, z);
        Point3D p2 = new Point3D(contW + x, y, z);
        Point3D p3 = new Point3D(x, contH + y, z);
        Point3D p4 = new Point3D(contW + x, contH + y, z);
        createLine(p1, p2);
        createLine(p1, p3);
        createLine(p3, p4);
        createLine(p2, p4);

        Point3D p5 = new Point3D(x, y, contD + z);
        Point3D p6 = new Point3D(contW + x, y, contD + z);
        Point3D p7 = new Point3D(x, contH + y, contD + z);
        Point3D p8 = new Point3D(contW + x, contH + y, contD + z);
        createLine(p5, p6);
        createLine(p5, p7);
        createLine(p7, p8);
        createLine(p6, p8);

        createLine(p1, p5);
        createLine(p2, p6);
        createLine(p3, p7);
        createLine(p4, p8);
    }

    double strokewidth = 1;
    public void createLine(Point3D origin, Point3D target) {        
        //creates a line from one point3d to another

        Point3D yAxis = new Point3D(0, 1, 0);
        Point3D diff = target.subtract(origin);
        double height = diff.magnitude();

        Point3D mid = target.midpoint(origin);
        Translate moveToMidpoint = new Translate(mid.getX(), mid.getY(), mid.getZ());

        Point3D axisOfRotation = diff.crossProduct(yAxis);
        double angle = Math.acos(diff.normalize().dotProduct(yAxis));
        Rotate rotateAroundCenter = new Rotate(-Math.toDegrees(angle), axisOfRotation);

        Cylinder line = new Cylinder(strokewidth, height);

        line.getTransforms().addAll(moveToMidpoint, rotateAroundCenter);

        myGroup.getChildren().add(line);
    }

Метод createLine можно использовать отдельно для создания линий между разными точками. Я не могу дать много комментариев по этому методу, потому что я в основном скопировал его из какого-то блога. Хотя мне трудно снова найти этот блог.

person Cas    schedule 17.01.2018
comment
Рассмотрите возможность добавления комментариев в свой код, чтобы пояснить, что он делает. - person Alex Quilliam; 17.01.2018

Спасибо, Алекс Куиллиам, спасибо за код, я смог улучшить свою программу. https://i.imgur.com/HY2x9vF.png

Cylinder line = new Cylinder(strokewidth, height);

Box line = new Box(strokewidth, height, strokewidth);

JavaFX_3D_Cube_Outline_Test

person GanJun    schedule 04.06.2020