我正在为我大学的一个项目使用 helix-toolkit 库的 sharpDX 分支(HelixToolKit 库)
目前我正在寻找一种在视口中正确选择元素的方法。
我在 helixtoolkit 库的源代码中找到了一个有用的示例:GitHub 上的示例代码
public class MyLineGeometryModel3D : LineGeometryModel3D
{
private Color? initialColor = null;
public override bool HitTest(Ray rayWS, ref List<HitTestResult> hits)
{
if (initialColor == null)
{
initialColor = this.Color;
}
var result = base.HitTest(rayWS, ref hits);
var pressedMouseButtons = Viewport3DX.GetPressedMouseButtons();
if (pressedMouseButtons == 0 || pressedMouseButtons.HasFlag(MouseButtons.Left))
{
this.Color = result ? Color.Red : this.initialColor.Value;
}
return result;
}
}
我设法让它在我的应用程序中运行。但是,不是只选择最顶部的元素,而是选择与射线相交的所有元素。可能需要某种处理函数来突出显示距离最短的元素?
我为此检查了一些标准的 WPF 解决方案,他们经常使用事件处理程序。(例如WPF 中的 3D 命中测试)
private void m_viewport3d_MouseDown(object sender, MouseButtonEventArgs e)
{
Point mousePos = e.GetPosition(m_viewport3d);
PointHitTestParameters hitParams = new PointHitTestParameters(mousePos);
HitTestResult result = VisualTreeHelper.HitTest(m_viewport3d, mousePos);
RayMeshGeometry3DHitTestResult rayMeshResult = result as RayMeshGeometry3DHitTestResult;
if (rayMeshResult != null)
{
MeshGeometry3D mesh = new MeshGeometry3D();
mesh.Positions.Add(rayMeshResult.MeshHit.Positions[rayMeshResult.VertexIndex1]);
mesh.Positions.Add(rayMeshResult.MeshHit.Positions[rayMeshResult.VertexIndex2]);
mesh.Positions.Add(rayMeshResult.MeshHit.Positions[rayMeshResult.VertexIndex3]);
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
GeometryModel3D marker = new GeometryModel3D(mesh, new DiffuseMaterial(Brushes.Blue));
//...add marker to the scene...
}
}
使用事件处理程序是一个明智的解决方案吗?如果是,如何在事件处理程序中获取用于调用 HitTest 函数的射线元素?