绘图点鼠标点击
问题描述:
我正在使用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#版本
注意:您需要如果在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;
应该这样做,希望有帮助,怎么做,如果你找到一个更好的解决办法通知我们。 :)
只是一个想法..第一行是你得到一个点使用鼠标点击;使用螺旋Point2DToPoint3D的辅助方法,你可以得到一个Point3D来获取三维空间中的点击点并使用它来绘制点。或者换句话说,视口具有'CursorOnelementPosition'属性,该属性给出stl模型上的点击点。 – Nit