×

WinForms/WPF 也能做 3D 图形?试试这个基于 OpenTK 的开源库

独孤求败 独孤求败 发表于2026-03-18 14:28:24 浏览43 评论0

抢沙发发表评论

前言

工业软件、科学计算或数据分析类桌面应用中,三维图表往往是理解复杂空间关系的关键。然而,在.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.Wpf

2、在 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(-150150);
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(1110.8// 半透明白色基底
);

surface.FaceDisplayed = true;
surface.WireframeDisplayed = true;
surface.WireframeColor = Color.CYAN.Mul(new Color(1110.5));

// 添加到场景
chart.Scene.Graph.Add(surface);

项目效果

映射曲面(Mapper Surface)

图片

三维散点图(Scatter Graph)

图片

德劳内曲面(Delaunay Surface)

图片

项目源码

为了防止丢失,可以在评论区留言关键字3D图表,即可获取完整源码地址。

图片

总结

项目在于将复杂的 3D 渲染抽象为直观的 C# 对象模型。我们无需关心 OpenGL 状态机、着色器或缓冲区管理,只需关注数据本身和视觉表达。架构清晰、功能实用,已在多个 Demo 中验证了稳定性与表现力。

对于需要在 .NET 桌面应用中快速集成三维可视化的团队或个人,一个值得尝试的开源方案。它或许不是最炫酷的,但足够"够用、好用、能跑"。

正如一句老话所说:真正强大的工具,不在于它有多复杂,而在于它能让用户把复杂问题变得多简单。


群贤毕至

访客