How to: Hit Test in a Viewport3D


This example shows how to hit test for 3D Visuals in a Viewport3D.

Because HitTest returns 2D and 3D information, it is possible to iterate through the test results to read only 3D results.

        public void HitTest(object sender, System.Windows.Input.MouseButtonEventArgs args)
            Point mouseposition = args.GetPosition(myViewport);
            Point3D testpoint3D = new Point3D(mouseposition.X, mouseposition.Y, 0);
            Vector3D testdirection = new Vector3D(mouseposition.X, mouseposition.Y, 10);
            PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);
            RayHitTestParameters rayparams = new RayHitTestParameters(testpoint3D, testdirection);

            //test for a result in the Viewport3D
            VisualTreeHelper.HitTest(myViewport, null, HTResult, pointparams);

The HitTestResultBehavior in the following code determines how the hit test results are processed. UpdateResultInfo and UpdateMaterial are locally defined methods.

        public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
            RayHitTestResult rayResult = rawresult as RayHitTestResult;

            if (rayResult != null)
                RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;

                if (rayMeshResult != null)
                    GeometryModel3D hitgeo = rayMeshResult.ModelHit as GeometryModel3D;

                    UpdateMaterial(hitgeo, (side1GeometryModel3D.Material as MaterialGroup));

            return HitTestResultBehavior.Continue;

3-D Hit Testing Sample