1

あるCylinder3D ポイントで開始し、別の 3D ポイントで終了する必要があるとします。

私の知る限り、その方法は、2 点間のユークリッド距離を計算し、同じ長さの円柱を作成することです。次に、円柱が実際に開始点から開始し、終了点で終了するように、円柱を平行移動および回転する必要があります。

私はこれらの変換を台無しにしてしまい、円柱を正しい場所に配置することに成功しません。

関数の実装のコード スニペットを教えてください。

void createCylinder(Group group, double p1X, double p1Y, double p1Z, 
                                 double p2X, double p2Y, double p2Z)
4

1 に答える 1

3

解決策を見つけたので、自分自身に答えます。

ここで動作する素敵なスニペットを見つけました: 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;
}
于 2016-08-06T00:36:15.257 に答える