簡體   English   中英

如何在WPF中HitTest XAML 3D對象

[英]How to HitTest XAML 3D object in WPF

我想做的是知道用戶是否單擊我的操縱桿的紅色按鈕。 (為此,我繪制了真實的操縱桿圖形以保持圖形不公開) 我們的XAML 3D游戲桿

該操縱桿是XAML 3D。

紅色按鈕是帶有x:Name“ Geo_Btn_CSS_TAKE”的GeometryModel3D對象。 當我單擊操縱桿時,我可以執行HitTest,他給了我所有的GeometryModel3D對象,但是我無法訪問x:Name,所以我不知道哪一個是好對象...

我對象的視覺樹

這就是我執行HitTest的方法:

private void OnTouchMouseDown(EventArgs e)
{
    Viewport3D viewport3D = WtoHitTest((Grid)Parent, e) as Viewport3D; // My own HitTest works well, I get my viewport3D

    Point mouseposition = WtoHelper.GetPositionFromEvent(e, viewport3D); // Get the point if it's a mouse event or touch event
    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);

    VisualTreeHelper.HitTest(viewport3D, null, HTResult, pointparams);
}

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;

            **// HERE I NEED TO KNOW WHAT IS MY GEOMETRYMODEL3D'S X:NAME**
            // ANY IDEA???
        }
    }
    return HitTestResultBehavior.Continue;
}

我還知道什么:

  • 我的3D對象沒有可以綁定到的位置(x,y)
  • 我無法在Viewport3D中插入非3D元素
  • 我無法訪問3D對象的x:Name
  • 3D對象是否不是FrameworkElement或Visual。 他們是Media3D

我這樣做的方式,我只需要知道x:name即可完成我的實現...如果有人有提示或其他方法,請告訴我。

謝謝

編輯:這是我的3D對象的屬性: 在此處輸入圖片說明

我可以想到的一件事是,它對XAML友好,並且可以在GeometryModel3D上定義您自己的附加屬性。 在此處查找如何創建自定義附加屬性。

我知道這是一篇過時的文章,但是在搜索排名中卻很高,由於我正在學習WPF 3D,因此偶然發現了它。 解決該問題的第二種方法是使用Helix Toolkit。 他們使用SetName()和GetName()方法擴展了GeometryModel3D。 因此,您可以將其命名,然后在進行射線測試時獲得名稱:

RayMeshGeometry3DHitTestResult rayHit = hr as RayMeshGeometry3DHitTestResult; //hr is of type HitTestResult
MessageBox.Show("Model found: " + rayHit.ModelHit.GetName());

當然,這意味着將Helix Toolkit添加到組合中,但是到目前為止,它在幾種方面都是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM