Select 名称为 HelixToolkit

Select by name HelixToolkit

简介

我正在 WPF 中实现 3D 查看器,在查看器中我需要能够 select 对象并通过它们的名称来识别它们。

问题

我可以 select 使用鼠标毫无问题地找到对象,但我无法获取对象名称,为了测试应用程序,我用茶壶设置了一个简单的场景,我的目标是能够检索对象的名称.

xaml 文件:

<Grid>
    <h:HelixViewport3D Name="h_viewport" MouseDown="mdown_select">
        <h:DefaultLights/>
        <h:Teapot x:Name="h_teapot"/>
    </h:HelixViewport3D>
</Grid>

选择方法:

private void mdown_select(object sender, MouseButtonEventArgs e)
        {
            Point mousePt = e.GetPosition(this);
            PointHitTestParameters ptParams = new PointHitTestParameters(mousePt);

            //Test for a result in the Viewport3D
            VisualTreeHelper.HitTest(h_viewport, null, HTResult, ptParams);
        }

        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 hitGeometry = rayMeshResult.ModelHit as GeometryModel3D;
                    //Trying to find the name
                    string name = hitGeometry.GetName();

                    //It returns true, I've found the teapot but not the name
                    if (hitGeometry.Equals(h_teapot.Content))
                        //No name here
                        System.Diagnostics.Debug.WriteLine("teapot found: " + hitGeometry.GetName());
                }
            }

            return HitTestResultBehavior.Stop;
        }

问题

名称是否隐藏在 selected 对象的某处,或者只是菜单 class 的参考? 我可以实现此目的的另一种可能方法?

helix 工具包似乎只保存附加属性,所以要找到茶壶的名称,我必须使用 helix 添加名称 属性 h:AttachedProperties.Name="myteapot".

<Grid>
    <h:HelixViewport3D Name="h_viewport" MouseDown="mdown_select" h:AttachedProperties.Name="myteapot">
        <h:DefaultLights/>
        <h:Teapot x:Name="h_teapot"/>
    </h:HelixViewport3D>
</Grid>

并通过获取visualmesh找到代码中的对象

RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;
string name = rayMeshResult.VisualHit.GetName(); //returns "myteapot"