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"
简介
我正在 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"