张春成

V2

2021/12/17阅读:58主题:默认主题

搬砖小能手

搬砖小能手

常见的三维数据有两种, 一种是高度结构化的点集和面元数据,易于使用3D渲染工具,如OpenGL绘制; 另一种是单纯的体素数据,就让人很头疼。 本文提出的解决方法是像砖墙一样,将体素垒起来。


以金字塔为例

用三维数据表示一个金字塔式的结构有两种表示方式,

  • 使用点集和面元的结构化表示法,将它的外形勾勒出来;
  • 使用堆叠式的体素结构,将它的体积罗列出来。

第一种方式易于表达和呈现, 表示一个金字塔,只需要将其抽象为正四边形, 只需要4个顶点和4个面就可以完成。 计算机视觉领域中,常见的三维模型就是使用这样的结构。

而第二种方式则需要大量的体素, 它们需要构成一个巨大的立体方块, 金字塔内部的点值较大,而外部的值较小。 从计算机视觉的角度来看,这是非常笨拙的表示方式, 但现实的物理问题,如CTMRI图像往往就是这样获得和表示的。

体素数据的堆叠显示

为了在三维空间中显示体素,需要对它们进行一些“加工”。 一种简单易行的方式是用正方体将它“包裹”起来

Mat3-0
Mat3-0

可见,体素从抽象的“点”,被包装成了具体的点集-面元数据。 加工完成后,绘制体素的问题就转换成绘制“正方体”的问题

Mat3-1
Mat3-1

当然,在这个例子中为了明显起见, 我并没有使小正方体彼此接触。 在绘制大量体素的情况下, 需要将这些小正方体进行适当膨胀, 从而看上去像是连续的空间。

PyOpenGL实现

事实证明, 这种方式是比较可行的。 对CT数据的呈现效果如下

【这是一段棒到不行的视频】

本工程用pyOpenGL实现, 顺便搭建了一个实用且能够实时交互的3D渲染工具, 本工程的代码可见我的GITHUB工程[1]

需要注意的是, 由于本方法对全部体素进行渲染, 所以需要渲染的点数量极多, 这就对性能要求较高。

在代码工作中, 需要添加VBO机制的支持

VBO: VertexBuffer Object

在日常使用的PC机上, 可以实时渲染100万顶点规模的三维模型, 性能是可以让人满意的。

参考资料

[1]

GITHUB工程: https://github.com/listenzcc/CT-Display

分类:

后端

标签:

后端

作者介绍

张春成
V2