JavaFX 3D:将圆柱体转换为定义的起点和终点
JavaFX 3D: Transforming Cylinder to defined start and end points
假设我想要一个 Cylinder
从某个 3D 点开始并在其他某个 3D 点结束。
据我所知,这样做的方法是计算两点之间的欧几里德距离并创建一个具有相同长度的圆柱体。然后,圆柱体应该平移和旋转,这样它才真正开始于起点,结束于终点。
我搞砸了这些转换,没能成功地将圆柱体放在正确的位置。
能否请您分享一些实现该功能的代码片段:
void createCylinder(Group group, double p1X, double p1Y, double p1Z,
double p2X, double p2Y, double p2Z)
在找到解决方案后回答自己。
在这里找到了一个很好用的片段:http://netzwerg.ch/blog/2015/03/22/javafx-3d-line/
这是代码,很简单:
public Cylinder createConnection(Point3D origin, Point3D target) {
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(1, height);
line.getTransforms().addAll(moveToMidpoint, rotateAroundCenter);
return line;
}
假设我想要一个 Cylinder
从某个 3D 点开始并在其他某个 3D 点结束。
据我所知,这样做的方法是计算两点之间的欧几里德距离并创建一个具有相同长度的圆柱体。然后,圆柱体应该平移和旋转,这样它才真正开始于起点,结束于终点。
我搞砸了这些转换,没能成功地将圆柱体放在正确的位置。
能否请您分享一些实现该功能的代码片段:
void createCylinder(Group group, double p1X, double p1Y, double p1Z,
double p2X, double p2Y, double p2Z)
在找到解决方案后回答自己。
在这里找到了一个很好用的片段:http://netzwerg.ch/blog/2015/03/22/javafx-3d-line/
这是代码,很简单:
public Cylinder createConnection(Point3D origin, Point3D target) {
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(1, height);
line.getTransforms().addAll(moveToMidpoint, rotateAroundCenter);
return line;
}