前言
工业软件、科学计算或数据分析类桌面应用中,三维图表往往是理解复杂空间关系的关键。然而,在.NET 生态中实现高质量的 3D 可视化一直是个挑战——要么依赖重量级商业控件,要么需要深入 OpenGL 底层开发。
本文推荐一个为 C# 开发提供一条"轻量但强大"的中间路径。它基于成熟的 Java 3D 库 Jzy3d 移植而来,通过 OpenTK 封装 OpenGL 能力,以简洁的 API 实现了曲面、散点、线框等常见三维图表类型,并支持 WinForms 与 WPF 双框架集成。
项目介绍
一个专为 .NET 平台设计的 3D 图表 API,其核心目标是让开发无需掌握图形学细节,也能快速构建交互式三维可视化界面。
项目并非从零造轮子,而是对 Java 社区广受好评的 Jzy3d 库进行 C# 重写,保留了其清晰的架构与丰富的图表能力。
技术上依赖 OpenTK 4.6.7 作为底层 OpenGL 绑定,并集成了较新的 WinForms GLControl,确保在现代 .NET 环境(如 .NET 6.0)下稳定运行。
项目功能
提供三种典型的三维数据展示方式,覆盖多数工程与科研场景:
1、映射曲面(Mapped Surface)
通过定义二维网格和数学函数(如 z = f(x, y)),自动生成光滑的三维曲面。适用于地形建模、热力分布、函数可视化等连续数据场景。
2、德劳内三角剖分曲面(Delaunay Surface)
输入一组无序的三维点坐标,自动构建三角网格形成连续曲面。特别适合处理传感器采样、点云重建等非结构化数据。
3、三维散点图(Scatter Plot)
在空间中绘制大量带颜色的点,支持百万级点渲染(官方示例展示 100 万点)。可用于聚类分析、空间分布观察等。
另外,所有图表均支持:
颜色映射:内置彩虹色图(ColorMapRainbow),可按 Z 值动态着色,并支持透明度调节;
面片 + 线框组合显示:同时呈现表面与结构线,增强立体感;
交互式视角控制:支持旋转、缩放、平移,提供透视(Perspective)与正交(Orthographic)两种相机模式;
文本标签:可在图表中添加坐标轴或数据点标签。
项目框架支持
项目针对 .NET 两大主流桌面 UI 框架提供了集成方案:
WinForms:提供专用的 Renderer3D 控件,直接从工具箱拖拽到窗体即可使用,集成极为简便;
WPF:由于 WPF 本身不直接支持 OpenGL,需通过 WindowsFormsHost 嵌入 WinForms 的 GL 控件。项目中已包含 WpfDemo 示例,展示了完整的嵌入方法。
注:尽管 WPF 集成稍复杂,但实际渲染性能与 WinForms 版本一致,因底层均为同一 OpenGL 上下文。
项目使用
1、通过 NuGet 安装
根据项目类型选择对应包:
# 核心库(必须)
Install-Package xxx -Version 0.1.0
# WinForms 项目额外安装
Install-Package xxx.Winforms
# WPF 项目额外安装
Install-Package xxx.Wpf2、在 WinForms 中使用
安装后,Renderer3D 控件会自动出现在 Visual Studio 工具箱中。
将其拖放到窗体上,即可获得一个可交互的 3D 画布。
注意:部分 .NET 版本可能存在设计器报错(如图),但不影响运行时功能。若遇此问题,可忽略设计器错误,直接编写代码逻辑。
3、官方示例
仓库中包含 xx.WinformsDemo 和 xx.WpfDemo 两个完整示例项目,涵盖曲面、散点、德劳内三角等多种图表的创建代码。
项目代码
创建一个彩虹色映射曲面为例:
// 创建图表
var chart = new Chart.Chart(renderer3D, Quality.Nicest);
chart.View.CameraMode = CameraMode.PERSPECTIVE;
chart.View.IncludingTextLabels = true;
// 定义网格范围
var range = new Maths.Range(-150, 150);
constint steps = 50;
// 构建曲面(需自定义 MyMapper 函数)
var surface = Plot3D.Builder.BuildOrthonomal(
new OrthonormalGrid(range, steps, range, steps),
new MyMapper()
);
// 设置颜色映射
surface.ColorMapper = new ColorMapper(
new ColorMapRainbow(),
surface.Bounds.ZMin,
surface.Bounds.ZMax,
new Color(1, 1, 1, 0.8) // 半透明白色基底
);
surface.FaceDisplayed = true;
surface.WireframeDisplayed = true;
surface.WireframeColor = Color.CYAN.Mul(new Color(1, 1, 1, 0.5));
// 添加到场景
chart.Scene.Graph.Add(surface);
项目效果
项目在于将复杂的 3D 渲染抽象为直观的 C# 对象模型。我们无需关心 OpenGL 状态机、着色器或缓冲区管理,只需关注数据本身和视觉表达。架构清晰、功能实用,已在多个 Demo 中验证了稳定性与表现力。 对于需要在 .NET 桌面应用中快速集成三维可视化的团队或个人,一个值得尝试的开源方案。它或许不是最炫酷的,但足够"够用、好用、能跑"。 正如一句老话所说:真正强大的工具,不在于它有多复杂,而在于它能让用户把复杂问题变得多简单。映射曲面(Mapper Surface)
三维散点图(Scatter Graph)
德劳内曲面(Delaunay Surface)
项目源码
为了防止丢失,可以在评论区留言关键字「3D图表」,即可获取完整源码地址。
总结