绘制点鼠标点击

本文关键字:鼠标 绘制 | 更新日期: 2023-09-27 18:15:23

我使用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

绘制点鼠标点击

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

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

ContactPoint是一个Point3D类型

这可能有帮助,但可能不是最有效的。试试以下命令:

这将创建一个可以在给定坐标下渲染的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#版本

注意:如果helixviewport是在xaml中定义的,你需要一个对它的引用。将x:Name:"设置为适当的值。例如x:Name="helixViewPort"
ModelVisual3D visualizer = new ModelVisual3D();
visualizer.Content = sphereModel;
helixViewPort.Children.Add(visualizer);
<<p> XAML版本/em>

我假设你的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;

应该就这样了,希望能有所帮助,如果你找到更好的解决方案,请告诉我们。:)