// Left mouse button click initiates tracking operation. protected override void OnMouseLeftButtonDown(MouseButtonEventArgs args) { base.OnMouseLeftButtonDown(args); Point ptMouse = args.GetPosition(viewport); HitTestResult result = VisualTreeHelper.HitTest(viewport, ptMouse); // We're only interested in 3D hits. RayMeshGeometry3DHitTestResult result3d = result as RayMeshGeometry3DHitTestResult; if (result3d == null) { return; } // We're only interested in ModelVisual3D hits. ModelVisual3D vis3d = result3d.VisualHit as ModelVisual3D; if (vis3d == null) { return; } // We're only interested in visuals with translate transforms. transTracking = vis3d.Transform as TranslateTransform3D; if (transTracking == null) { return; } LineRange range; ViewportInfo.Point2DtoPoint3D(viewport, ptMouse, out range); pointOriginal = range.PointFromZ(transTracking.OffsetZ); transOriginal = transTracking.Clone(); isTracking = true; CaptureMouse(); Focus(); args.Handled = true; }