体素...老实说,我需要知道从哪里开始。

14

好的,我知道体素基本上是像素的三维版本。

之后,我甚至不知道该寻找什么。

谷歌搜索没有显示任何教程,我无法在任何地方找到相关书籍,甚至找不到任何与体素真正的基本概念有关的东西。

我了解C++库的大部分内容,并掌握OpenGL的基础知识。

有人可以指点我吗?

编辑:我想我只是困惑于如何实现它们?对不起我这么烦,只是我找不到任何可以轻松对应的东西...我认为我想象中的体素是和向量相似,你可以实际存储数据。

一个体素可以被表示为任何3D形状吗?例如,假设我想要形状是圆柱体。这可能吗,还是它们必须像立方体一样链接?


4
你试图用体素做什么?冒着显而易见的风险说... http://en.wikipedia.org/wiki/Voxel - Chinasaur
1
除了holtavolt的答案之外,“点云”、“Marching Cubes”和“稀疏体素八叉树”都是要搜索的关键词,这可能会让你更接近可实现的东西,而不仅仅是一个抽象的概念。 - Merlyn Morgan-Graham
如果你理解如何将二维点(像素)放到一个二维数组中以形成二维形状,那么如何将三维点(体素)放到一个三维数组中以形成三维形状就没什么可解释的了。实际上,这是一回事。 - Shahbaz
6个回答

9

Minecraft 是使用体素的一个很好的例子。在 Minecraft 中,每个体素都是一个立方体。

如果想看一个 C++ 的例子,可以看看 Minecraft 的克隆版 Minetest-c55。这是开源的,所以你可以阅读所有的源代码来了解它是如何完成的。

体素不一定要是立方体,它们可以是金字塔或任何其他能够拼合在一起的形状。


编辑:我想我只是不知道如何实现它们?对不起我这么麻烦,只是我真的找不到任何我可以轻松相关的东西......我认为我想象中一个体素与你实际上可以存储数据的向量有关。一个体素可以被表示为任何3D形状吗?例如,假设我想要的形状是一个圆柱体。这是可能的吗,还是它们必须像立方体一样链接? - Fiattarone
@Fiattarone:Minetest-c55项目的GPL许可证已经获得完整的源代码。我认为它相当容易阅读。 - Zan Lynx
一种思考它们的方式就是将它们视为均匀三维网格中标量数据的样本。你可以想象将每个单独的样本渲染为立方体、点、球体、金字塔等等——如果你试图实现绘制完整表面的效果,你将希望它们与相邻的样本“链接”起来。 - holtavolt
哇,我完全跳过了源代码部分。 谢谢!我觉得现在一切都开始串联起来了。 - Fiattarone

6
我猜测您正在寻找有关“体绘制”技术的信息(因为您提到了体素和OpenGL)。您可以在搜索该术语时找到大量简单的C++渲染代码,以及更高级的OpenGL着色器。请参考Volume Rendering

4

4
在最简单的实现中,体素空间只是一个三维数组。对于固体,您可以每个体素使用一个位:1 == 填充,0 == 空。使用隐式公式来制作形状,例如,球体是从中心体素半径内的所有体素。
体素与基于多边形的3D渲染不太兼容,但它们在图像分析,医学成像,计算机视觉等领域被广泛使用...

1

通常情况下,体素是指在某个三维空间中具有体积的位置(类似于像素包含的区域)。

就像在图像中,像素包含一些标量值(灰度)或值向量(如彩色图像中的向量可以是红、绿和蓝分量,或色调、饱和度和亮度分量),体素的条目也可以具有一些比例或值向量。

一些自然的包含体素的体积图像的例子是三维医学影像,如CT、MRI、3D超声等。

从数学上讲,三维图像是从某个体素空间到一些数字集合的函数。


1

寻找voxlap或尝试这个http://www.html5code.com/gallery/voxel-rain/,或者编写自己的代码。是的,一个体素可以被简化为一个3D坐标(可以通过它在文件结构中的位置来暗示),以及可以是任何东西的图形表示(立方体、球体、图片、颜色...)。就像像素是带有颜色索引的2D坐标一样。

您只需要解析文件并呈现相应的体素即可。不幸的是,没有“正确”的文件格式,尽管voxlaps文件格式似乎非常不错。

祝你好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接