public override void UpdatePointPosition(int index, Mouse3DPosition vertex) { var trsfInterpreter = Node.Set <TransformationInterpreter>(); if (_initialDraggingPosition == null) { InitializeDragging(vertex, trsfInterpreter); } //Log.DebugFormat("@pivot {0} {1} {2}", trsfInterpreter.Pivot.X(), trsfInterpreter.Pivot.Y(), trsfInterpreter.Pivot.Z()); var rotate = new gpPnt(0, 0, 0); var startDraggingVector = new gpVec(trsfInterpreter.Pivot, _initialDraggingPosition.Value.GpPnt); if (startDraggingVector.Magnitude <= gp.Resolution) { return; } var currentDraggingVector = new gpVec(trsfInterpreter.Pivot, vertex.Point.GpPnt); if (currentDraggingVector.Magnitude <= gp.Resolution) { return; } var currentGizmo = GetPointLocation(index); var rotationAxis = currentGizmo.Direction; if (rotationAxis.IsParallel(gp.OX.Direction, Precision.Angular)) { var rotationAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OX.Direction)) - _previousAngle; _previousAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OX.Direction)); rotate.X = GeomUtils.RadiansToDegrees(rotationAngle); } else if (rotationAxis.IsParallel(gp.OY.Direction, Precision.Angular)) { var rotationAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OY.Direction)) - _previousAngle; _previousAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OY.Direction)); rotate.Y = GeomUtils.RadiansToDegrees(rotationAngle); } else if (rotationAxis.IsParallel(gp.OZ.Direction, Precision.Angular)) { var rotationAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OZ.Direction)) - _previousAngle; _previousAngle = startDraggingVector.AngleWithRef(currentDraggingVector, new gpVec(gp.OZ.Direction)); rotate.Z = GeomUtils.RadiansToDegrees(rotationAngle); } //Log.DebugFormat("@rotation angle {0}", GeomUtils.RadiansToDegrees(rotationAngle)); trsfInterpreter.Rotate = rotate; }