0

我正在使用 HelixToolkit 查看 STL 文件并与之交互。我需要在窗口上绘制或标记用户单击的点。我有坐标,我知道在哪里画那个点,但我不知道怎么画,有人可以帮我吗?我发布了一些代码来解释我现在所拥有的:

    private void vierport3d_MouseRightClick(object sender, MouseButtonEventArgs e)
    {
        Point mousePos = e.GetPosition(viewPort3d);
        PointHitTestParameters hitParams = new PointHitTestParameters(mousePos);
        VisualTreeHelper.HitTest(viewPort3d, null, ResultCallback, hitParams);
    }

public HitTestResultBehavior ResultCallback(HitTestResult result)
    {
        RayHitTestResult rayResult = result as RayHitTestResult;
        if (rayResult != null)
        {
            RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;

            //HERE I HAVE THE LOCATION TO DRAW
            MessageBox.Show(rayMeshResult.PointHit.X + " " + rayMeshResult.PointHit.Y + " " + rayMeshResult.PointHit.Z);

            if (rayMeshResult != null)
            {
                // I THINK I HAVE TO DRAW THE POINT HERE
            }
        }

        return HitTestResultBehavior.Continue;
    }

PD:我在 viewport3d 上显示 stl。

4

2 回答 2

0

这可能会有所帮助,但它可能不是最有效的。尝试以下操作:

这将创建一个可以在给定坐标处渲染的 3D 球体。

var sphereSize = 0.025;
/* keep these values low, the higher the values the more detailed the sphere which may impact your rendering perfomance.*/
var phi   = 12;
var theta = 12;

MeshBuilder meshBuilder = new MeshBuilder();

将您的 x,y,z 传递给第一个参数。即点击 3D 位置。

meshBuilder.AddSphere( new Point3D(x,y,z), sphereSize , theta, phi); 

GeometryModel3D sphereModel = new GeometryModel3D(meshBuilder.ToMesh(),MaterialHelper.CreateMaterial(Brushes.Green,null,null,1,0));

在视口中渲染点

您将需要一个 ModelVisual3D 组件作为 HelixViewport 的子组件。(这可以在 C# 或 XAML 中实现)由你决定,我会同时展示两种方式。

C#版本

注意:如果在 xaml 中定义了 helixviewport,则需要引用它。将 x:Name:"" 设置为适当的值。例如 x:Name="helixViewPort"

ModelVisual3D visualizer = new ModelVisual3D();
visualizer.Content = sphereModel;
helixViewPort.Children.Add(visualizer);

XAML 版本

我假设您的 xaml 代码至少有一个螺旋视口,因此如果没有,您必须将 ModelVisual3D 子项添加到螺旋视口。

<h:HelixViewport3D x:Name="HelixPlotViewPort" >
   <h:DefaultLights/>
   <ModelVisual3D x:Name="Visualizer">

   </ModelVisual3D>

</h:HelixViewport3D>

//Then in C# add the following
Visualizer.Content = sphereModel;

应该可以,希望对您有所帮助,如果您找到更好的解决方案,请通知我们。:)

于 2015-12-21T12:48:00.627 回答
0

我们的项目中有相同的场景,并使用球体直观地指示该点。

<ht:SphereVisual3D Radius="0.75" Fill="Red" Center="{Binding ContactPoint}" />

ContactPoint 是一种 Point3D 类型。

于 2015-10-12T19:52:14.243 回答