Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

JavaFX 8 3D : провести Cylinder от точки А до точки B, заданных Point3D объектами

Возникла необходимость соединить две точки цилиндром. Есть координаты двух точек, заданных, как экземпляры Point3D
Point3D pointA = new Point3D(100,200,150); Point3D pointB = new Point3D(200,150,-100);
Есть группа (javafx.scene.Group), в которой производятся построения:
Group space3D = new Group();
Задача: соединить эти две виртуальные точки (можно разместить в этих координатах по экземпляру Sphere радиусом 10, для наглядности) экземпляром javafx.scene.shape.Cylinder радиусом 2, высотой равной расстоянию от точки А до точки B с минимальным количеством действий.
П.С.: Какие альтернативы были бы более эффективными для визуального соединения двух точек в 3D пространстве?


Ответ

Начну от обратного.Пример решения:
public Cylinder paintCylinder(Point3D A, Point3D B) {
Point3D temp = A.subtract(B); double Y = temp.getX() != 0 || temp.getZ() != 0 ? B.getY() : B.getY() > A.getY() ? B.getY() : A.getY();
Point3D dir = A.subtract(B).crossProduct(new Point3D(0, -1, 0));
double angle = Math.acos(A.subtract(B).normalize().dotProduct(new Point3D(0, -1, 0)));
double h1 = A.distance(B);
Cylinder c = new Cylinder(2d, h1);
c.getTransforms().addAll(new Translate(B.getX(), Y - h1 / 2d, B.getZ()), new Rotate(-Math.toDegrees(angle), 0d, h1 / 2d, 0d, new Point3D(dir.getX(), -dir.getY(), dir.getZ())));
return c; }
Как результат:

теперь ближе к конкретным вопросам:
Так сложилось что легче для понимания процедуры вращения объекта это последовательное вращение по 3 координатам (и применяется такой подход часто) Но если разобраться то вполне естественный ход поворачивать объект всего один раз на один конкретный угол.И если быть совсем точным поворачивают систему координат дабы на одной плоскости оказались точки начала и конца дуги поворота. Возможна также работа с матрицей поворота и как пример работы с ней данный ответ.Да конечно такой подход быстрее чем работа с последовательным поворотом по трем осям но хочу заметить что сам автор ответа(он же к слову и разработчик библиотеки - FXyz) по моим наблюдениям конкретно матричной реализацией не пользуется (наблюдение рамках открытого кода на GitHub).

Комментариев нет:

Отправить комментарий