绘图点鼠标点击

问题描述:

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

+0

只是一个想法..第一行是你得到一个点使用鼠标点击;使用螺旋Point2DToPoint3D的辅助方法,你可以得到一个Point3D来获取三维空间中的点击点并使用它来绘制点。或者换句话说,视口具有'CursorOnelementPosition'属性,该属性给出stl模型上的点击点。 – Nit

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

这将创建一个可在给定坐标处呈现的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:名称=“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; 

应该这样做,希望有帮助,怎么做,如果你找到一个更好的解决办法通知我们。 :)