【问题标题】:Draw point where mouse clicked绘制鼠标点击的点
【发布时间】:2015-12-21 20:48:00
【问题描述】:

我正在使用 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。

【问题讨论】:

    标签: c# wpf point helix-3d-toolkit viewport3d


    【解决方案1】:

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

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

    ContactPoint 是 Point3D 类型。

    【讨论】:

    • 只是一个想法.. 第一行是您使用鼠标单击获得一个点;使用该方法和 helix Point2DToPoint3D 中的一种辅助方法,您可以获得 Point3D 以获取 3d 空间中的单击点并使用它来绘制点。或者另一种方式,视口是否具有“CursorOneelementPosition”属性,该属性给出了 stl 模型上的点击点。
    【解决方案2】:

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

    这将创建一个可以在给定坐标处渲染的 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);
    

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多