Share via


HOW TO:Viewport3D 中的點擊測試

本範例顯示如何對 Viewport3D 中的 3D 視覺物件進行點擊測試。

因為 HitTest 會傳回 2D 和 3D 資訊,所以可以逐一查看測試結果以只讀取 3D 結果。

        Public Sub HitTest(ByVal sender As Object, ByVal args As MouseButtonEventArgs)
            Dim mouseposition As Point = args.GetPosition(myViewport)
            Dim testpoint3D As New Point3D(mouseposition.X, mouseposition.Y, 0)
            Dim testdirection As New Vector3D(mouseposition.X, mouseposition.Y, 10)
            Dim pointparams As New PointHitTestParameters(mouseposition)
            Dim rayparams As New RayHitTestParameters(testpoint3D, testdirection)

            'test for a result in the Viewport3D
            VisualTreeHelper.HitTest(myViewport, Nothing, AddressOf HTResult, pointparams)
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);

下列程式碼中的 HitTestResultBehavior 決定點擊測試結果的處理方式。 UpdateResultInfo 和 UpdateMaterial 是在本機上定義的方法。

        Public Function HTResult(ByVal rawresult As HitTestResult) As HitTestResultBehavior
            Dim rayResult As RayHitTestResult = TryCast(rawresult, RayHitTestResult)

            If rayResult IsNot Nothing Then
                Dim rayMeshResult As RayMeshGeometry3DHitTestResult = TryCast(rayResult, RayMeshGeometry3DHitTestResult)

                If rayMeshResult IsNot Nothing Then
                    Dim hitgeo As GeometryModel3D = TryCast(rayMeshResult.ModelHit, GeometryModel3D)

                    UpdateResultInfo(rayMeshResult)
                    UpdateMaterial(hitgeo, (TryCast(side1GeometryModel3D.Material, MaterialGroup)))
                End If
            End If

            Return HitTestResultBehavior.Continue
        End Function
public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
{
    //MessageBox.Show(rawresult.ToString());
    RayHitTestResult rayResult = rawresult as RayHitTestResult;

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

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

            UpdateResultInfo(rayMeshResult);
            UpdateMaterial(hitgeo, (side1GeometryModel3D.Material as MaterialGroup));
        }
    }

    return HitTestResultBehavior.Continue;
}

請參閱

其他資源

立體點擊測試範例