c#-Wpf-使用HelixToolkit.Wpf绘制点云,根据深度给点云不同的颜色

我在使用HelixToolkit.Wpf.SharpDX绘制点云时,希望实现根据点云不同深度作颜色差异化展示,但无论赋什么值给Colors,点云始终是黑色的。以下是原来的部分代码:

.xaml

<hx:PointGeometryModel3D Geometry="{Binding Geometry}"/>

.xaml.cs

var (vectors,colors) = ConvertToVector3DCollection(points);
viewModel.Geometry = new PointGeometry3D{ Positions = vectors,Colors=colors};

 private (Vector3Collection vectors, Color4Collection colors) ConvertToVector3DCollection(System.Windows.Media.Media3D.Point3DCollection points)
 {
     Vector3Collection vectors = new Vector3Collection();
     var colors = new Color4Collection();
     Color4 MapDepthToColor(System.Windows.Media.Media3D.Point3D point)
     {
         float midZ = (minZ + maxZ)/2;
         //根据z轴的值来上色
         if ((point.Z - minZ) > midZ)
         {
             float r = (float)((point.Z - minZ - midZ) / midZ);
             float g = (float)(1 - ((point.Z - minZ - midZ) / midZ));
             return new Color4(r, g, 0, 1.0f);
         }else
         {
             float g = (float)((point.Z - minZ) / midZ);
             float b = (float)(1 - ((point.Z - minZ) / midZ));
             return new Color4(0, g, b, 1.0f);
         }
         
     }

     foreach (var point in points)
     {
         // Convert Point3D to Vector3D
         Vector3 vector = new Vector3((float)point.X, (float)point.Y, (float)point.Z);

         if (vector.Length() > 0.0001 || vector.Length() < -0.0001)
         {
             vectors.Add(vector);
             colors.Add(MapDepthToColor(point));
         }
     }

     return (vectors,colors);
 }
后来找了很久才找到https://stackoverflow.org.cn/questions/64926932
这篇上方法,试了下,果真可以!!!但是就不知道原理是啥!
就是加上一行代码: Color=“{x:Static Colors.White}”

.xaml改成如下

<hx:PointGeometryModel3D Geometry="{Binding Geometry}" Color="{x:Static Colors.White}"/>
Helix Toolkit是一个用于WPF和.NET的开源3D渲染引擎,它提供了许多用于创建3D图形的工具和控件。在使用Helix Toolkit绘制三维折线图时,可以使用Helix Toolkit中的LineGeometry3D类来创建折线图的线条,使用Point3D类来指定每个点的位置,使用Viewport3D类来显示3D场景。以下是一个简单的示例代码: ```csharp using HelixToolkit.Wpf; using System.Windows; using System.Windows.Media; using System.Windows.Media.Media3D; public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 创建一个3D场景 var viewport = new Viewport3D(); // 创建一个相机 var camera = new PerspectiveCamera { Position = new Point3D(0, 0, 5), LookDirection = new Vector3D(0, 0, -1), UpDirection = new Vector3D(0, 1, 0), FieldOfView = 60 }; // 将相机添加到3D场景中 viewport.Camera = camera; // 创建一个材质 var material = new DiffuseMaterial(Brushes.Blue); // 创建一个点集合 var points = new Point3DCollection(); points.Add(new Point3D(-1, 1, 0)); points.Add(new Point3D(1, 1, 0)); points.Add(new Point3D(1, -1, 0)); points.Add(new Point3D(-1, -1, 0)); // 创建一个线条 var line = new LinesVisual3D { Color = Colors.Blue, Thickness = 2, Points = points }; // 将线条添加到3D场景中 viewport.Children.Add(line); // 将3D场景添加到窗口中 Content = viewport; } } ``` 该示例代码创建了一个简单的四边形折线图,并将其添加到一个Viewport3D控件中显示。你可以根据自己的需求修改点的位置和线条的颜色、粗细等属性来绘制不同的三维折线图。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值