X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2Fcontrolpoint%2FPipeControlPoint.java;h=9e9beb9c37711e63012c006b4221839de8cfb819;hb=68314736ee2b8da184a5e01e88b719b4fd64ab49;hp=72ef4e687a0f378d24400f94ff79405585c61179;hpb=331dedf8ea2da8789bf5f1e720c306bc2094af53;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java index 72ef4e68..9e9beb9c 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/controlpoint/PipeControlPoint.java @@ -584,11 +584,16 @@ public class PipeControlPoint extends G3DNode implements IP3DNode { final P3DRootNode root = getRoot(); Vector3d up = root != null ? new Vector3d(root.getUpVector()) : new Vector3d(0.0, 1.0, 0.0); - double a = up.angle(getPathLegEndpointVector()); + final Vector3d legDir = getPathLegEndpointVector(); + double a = up.angle(legDir); if (a < 0.1 || (Math.PI - a) < 0.1) { // Rotate components up.set(up.getY(), up.getZ(), up.getX()); } + + // Project up vector into a normal of the leg direction before applying to 'dir' + MathTools.mad(up, legDir, -legDir.dot(up)/legDir.lengthSquared()); + up.normalize(); return getControlPointOrientationQuat(dir, up, angle); }